본문 바로가기

Lucene

[about Lucene] [4.0] Analyzer.ReuseStrategy

3.6 버전까지는 TokenStreamComponents를 재사용하기 위해서

커스텀 Analyzer를 만들때 ReusableAnalyzerBase 클래스를 상속받아야 했습니다.

그리고, reuseableTokenStream() 메서드를 실행하여 TokenStream을 얻어왔었는데요..


(참고 : http://devyongsik.tistory.com/377)


4.0에서 보니 ReusableAnalyzerBase 클래스가 없어지고 대신, TokenStreamComponents를 재사용하기 위해서

Analyzer.ReuseStrategy가 사용됩니다.


Strategy 패턴이고요.. 기본적으로 두개의 Strategy 구현 클래스가 제공됩니다.


1. GlobalReuseStrategy

2. PerFieldReuseStrategy


이름으로 쉽게 유추가 가능한데요...


Analyzer의 tokenStream(String fieldName, Reader reader) 메서드를 보시면 아래와 같이 구현되어있습니다.




components를 reuseStrategy.getReusableComponents 메서드를 사용해서 TokenStreamComponents를 가져오고 있습니다. 그게 없으면  createComponents 메서드를 사용하여 새로운 TokenStreamComponents를 만들어냅니다.

이 createComponents 는 Analyzer에 정의된 추상메서드로써, 커스텀 Analyzer를 만들때 구현해야하는 메서드입니다. WhitespaceAnalyzer를 보면 아래와 같이 구현되어있습니다.




템플릿메서드 패턴같이 보입니다...


아무튼, 여기서 말씀드리고 싶은 것은 reuseStrategy.getReusableComponents 인데요.. 기본적으로 2개의 구현클래스가 제공된다고 앞서 말씀을 드렸고, 별다른 설정을 하지 않으면 GlobalReuseStrategy가 셋팅됩니다. 


이 GlobalReuseStrategy.getReusableComponents  메서드를 보면 아래와 같이 되어있습니다.





여기서 getStoredValue는 ThreadLocal에 담겨져있던, TokenStreamComponents 입니다.

PerFieldReuseStrategy는 Map에 필드명으로 TokenStreamComponents를 저장합니다. 이 필드별로 저장하는 것은

어디에서 이점이 있는지 잘 모르겠네요.... 흠...


아무튼, 기본적으로 TokenStreamComponents를 사용하도록 되었네요. 4.0으로 버전업을 할 경우에 필수로 바꿔줘야 하는 부분인듯 합니다.