본문 바로가기

Lucene

[lucene] 분석기(Analyzer) 의 구조.

Analyzer는 텍스트를 일련의 토큰 (TokenStream)으로 변환한다. TokenStream 클래스는 Token 클래스를 차례로 반환한다.

Token은 문자열, 시작위치, 끝 위치, 토큰 종류, 위치 증가값등을 갖고 텀은
단어와 위치 증가값만을 사용하여 변환되며, 텀이 바로 색인에 저장되는 단위이다.

TokenStream에는 Tokenier와 TokenFilter가 있고
Tokenizer는 글자 단위로 토큰을 만들고, TokenFilter는 토큰 단위로 처리를 한다.

Tokenizer가 TokenStream을 반환하면, TokenFilter는 TokenStream을 입력 받아 TokenStream이 토큰을 뽑아내면 그 토큰에 새로운 토큰을 더하거나 삭제 할 수 있다. (분석기 확장 용이)

이를 염두에 두고 StopAnalyzer의 구조를 보면..

public class StopAnalyzer extends Analyzer {
  private Set stopWords;

  public StopAnalyzer() {
    stopWords = StopFilter.makeStopSet(StopAnalyzer.ENGLISH_STOP_WORDS);
  }

  public StopAnalyzer(String[] stopWords) {
    this.stopWords = StopFilter.makeStopSet(stopWords);
  }

  public TokenStream tokenStream(String fieldName, Reader reader) {
    return new StopFilter(
                    new LowerCaseTokenizer(reader, stopTable);
  }
}

일단 Tokenizer가 소문자로 변환한 토큰 스트림을 반환하면
StopFilter가 받아서 불용어 토큰을 삭제한다.

일반적으로 인자로 입력받은 input Stream을 사용해 token을 얻어와 자기자신 (filter)을
적용시켜 넘겨준다.

  public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream result = new SynonymFilter(
                          new StopFilter(
                            new LowerCaseFilter(
                              new StandardFilter(
                                new StandardTokenizer(reader))),
                            StandardAnalyzer.STOP_WORDS),
                          engine
                         );
    return result;
  }