lucene에는 n-gram tokenizer와 shingle analyzer가
( 정확히는 shingle analyzer wrapper)
포함되어 있긴 하지만 3.0.1 버젼을 기준으로 할때 contrib쪽에 포함되어 있다.
n-gram과 shingle을 가끔 혼동하시는 분도 계신데 둘은 약간 다르다고 볼수 있다.
n-gram이 한 문자를 기반으로 하는 반면에 shingle은 한 단어를 기반으로 한다.
"you can select"을 예를 들어보면,
n-gram 방식으로 bi-gram으로 한다면 yo, ou, uc, ca, an 이 될 것이고
shingle 방식으로 2-shingles로 한다면 you can, can select가 될 것이다.
검색을 해보니 lucene에서 n-gram을 사용하는 법에
관한 블로그는 이미 있는 듯하여
나는 lucene에서 shingle을 사용하는 방식을 간단히 설명하겠다.
lucene의 contrib쪽에 보면 analyzers 소스 폴더가 있다.
이 analyzers에 n-gram과 shingle 둘다 포함되어 있다.
우선 "ant build-contrib" 명령어를 통해 contrib쪽을 빌드하면
build/contrib/analyzers/common 폴더 밑에 lucene-analyzers-x.x.x-dev.jar 파일이
생성된다. ( x는 버젼명이다. 즉, 나의 경우는 3.0.1이 된다.)
이 jar파일을 classpath에 포함한후 src/java/org/apache/lucene/demo의 IndexFiles.java
에서 다음의 두 부분을 수정한후 빌드해 보자.
1. import 부분에 다음을 추가한다.
import org.apache.lucene.analysis.shingle.*;
2. IndexWriter 객체의 생성 부분을 다음과 같이 수정한다.
(대략 60 ~ 70 라인 사이에 있다. )
IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR),
//new StandardAnalyzer(Version.LUCENE_CURRENT),
new ShingleAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_CURRENT),3),
true,
IndexWriter.MaxFieldLength.LIMITED);
IndexWriter의 생성자에서 무엇이 수정되었는지는 쉽게 알수 있을것이다.
의미는 기본 analyzer로 StandardAnalyzer를 사용하고 shingle의 최대 크기를 3으로
한다이다.
이후 나머지 searcher를 이용한 검색과정등은 모두 동일하다.
댓글 없음:
댓글 쓰기