본문 바로가기

Lucene

[lucene] 모르겠다.. CharTokenizer..ㅠㅠ

CharTokenizer..

Analyzer WhitespaceAnalyzer = new WhitespaceAnalyzer();
TokenStream stream = analyzer.tokenStream("contents", new StringReader(text));

Token token = stream.next();

바로 이 next...!!

stream.next는 TokenStream의 next 메서드가 호출되고 이는

public Token next() throws IOException {
    Token result = next(new Token());

    if (result != null) { //이것들은 무엇을 하기 위한 로직인고..;;
      Payload p = result.getPayload();
      if (p != null) {
        result.setPayload((Payload) p.clone());
      }
    }

    return result;
  }

이렇게 생겼다.

첫 라인을 보면, next(Token) 메서드를 호출하는데 이는 CharTokenizer 클래스에서
오버라이드한 메서드가 호출된다.

보면, 문장을 읽어들여서 isTokenChar(char)를 사용하여 토큰단위로 분리해내고
Token.termLength, Token.startOffset, enfOffset을 설정해 주는듯 하다...

그런데..

소스 중
buffer = token.resizeTermBuffer(1+length);

이부분이 무엇을 위한 부분인지 이해가 되지 않고...

token.termText() 를 실행했을때
어떻게 토큰으로 잘려진 단어가 나오는지도 잘 모르겠다..

token.termText()는

public final String termText() {
    if (termText == null && termBuffer != null)
      termText = new String(termBuffer, 0, termLength);
    return termText;
  }

으로 되는데..
메서드를 봐서는 termBuffer에 잘려진 토큰 단어가
들어가 있어야 한다는 것인데.. (0부터 termLength만큼 가져오니까...)

그것을 어디서 설정해 주는지 당최 모르겠다..어흑..


알았다!!!!

CharTokenizer에서
public final Token next(Token token) throws IOException {
  char[] buffer = token.termBuffer();
...

이 부분을 통해 buffer에 Token 클래스의 termBuffer의 메모리를 할당하여
CharTokenizer에서 각각의 캐릭터를 하나하나 buffer에 할당하게 되면
자동적으로 Token의 termBuffer도 같은 값을 갖도록 되어있다.

그래서
char[] buffer = token.termBuffer();
이거 타고 들어가면 주구장창 Token 클래스의 termBuffer를 초기화 하는거라..


위에 모르겠다고 한
buffer = token.resizeTermBuffer(1+length);
이 부분은 단순히 처음 들어온 단어(토큰)가 너무 길때 이것을 새로 리사이징
해주는 것이고..

첫 스페이스나 char가 아닌 글자가 들어오면
    token.termLength = length;
    token.startOffset = start;
    token.endOffset = start+length;
이 값들을 할당하면서
Token을 리턴하는데 이때 이미

char[] buffer 와 Token의 char[] termBuffer는 같은 메모리를 참조하고 있기 때문에
자동적으로 리턴된 Token은 잘려진 termText를 가질 수 있게 된다.