루씬 3.5버전부터 제공되는 유틸리티성 클래스입니다.

IndexSearcher의 재사용과 IndexWriter로 변경된 인덱스를 새로 가져오기 위해

저런 매니저 클래스를 매번 새로 만들어서 사용했었는데 아예 3.5 버전부터 제공이 되어 나오네요.

(Lucene in Action 2판에도 소개가 되어있습니다. 361P)


여러 스레드가 IndexSearcher 인스턴스를 안전하게 열고 닫고 하면서 사용 할 수 있는

기능을 제공하여 줍니다. acquire/release API를 제공하며, IndexReader를 열고 닫기 위한 병렬처리의 복잡함을

알아서 처리해주도록 구현이 되어있습니다.


3.5버전과 3.6버전에서 SearcherManager 인스턴스를 생성하는 방법이 조금 바뀌었는데요.. 

(생성자의 파라메터가 변경되었습니다. 몇몇 메서드 이름하고..)


일단 3.5버전에서는 아래와 같이 생성합니다.


3.5 버전

3.6에서는 아래와 같이 SearcherFactory를 사용합니다. 이 클래스는 특별히 하는 것 없고 IndexReader를 받아서 새로운 IndexSearcher를 생성해 넘겨주는 역할을 합니다.


3.6버전

IndexWriter를 SearcherManager의 생성자의 파라메터로 넘겨주는 방법도 있습니다. 이 경우에는 Near Real Time IndexReader를 사용하기 때문에 mayberefresh 메서드를 실행함으로써 commit 없이도 새로 인덱스에 반영 된 내용을 가져 올 수 있습니다.

indexSearcher를 얻고 반환하는 방법은 아래와 같이 합니다.



몇 가지 테스트 케이스를 작성해서 돌려보았습니다.

1. indexWriter로 addDocument를 한 후 commit 없이 acquire

2. indexWriter로 addDocument를 한 후 commit 하고 acquire

3. indexWriter로 addDocument를 한 후 commit 없이 , maybeRefresh 메서드 실행 후 acquire

4. indexWriter로 addDocument를 한 후 commit 하고 , maybeRefresh 메서드 실행 후 acquire

5. SearcherManager를 IndexWriter로 생성하고 , 이 IndexWriter로 addDocument를 한 후 commit 없이 acquire

6. SearcherManager를 IndexWriter로 생성하고 , 이 IndexWriter로 addDocument를 한 후 commit 없이 maybeRefresh

메서드 실행 후 acquire


인덱스 파일의 변경내용을 indexSearcher가 어떤 경우에 반영하는지에 대한 테스트인데요

결론을 먼저 말씀드리면 4번, 6번의 경우에만 반영합니다. 이외에도 Near Real Time Search를 위한 NRTManager가 제공되는데 이 부분은 다음 포스트에 작성을 하고... 테스트 케이스를 보여드립니다. 

사실 6번의 케이스가 NRT Search랑 비슷하겠네요..




좀 더 자세한 내용은 아래의 블로그 (루씬 커미터이자 Lucene in Action의 저자)를 참고하여 주세요.


http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html


테스트 소스 : https://github.com/need4spd/aboutLucene




Posted by 용식