IndexSearcher는 Index의 변경 내용을 그 상태로는 인지 하지 못 합니다.
주로 IndexWriter에 의해서 추가적인 색인이 되거나
IndexReader에 의한 삭제등이 될텐데요..
제가 구현하고 있는 프로그램도 하루에 한번 로그를 분석 후 색인을 추가하기 때문에
색인 파일 변경에 대한 감지를 하여 이를 처리 할 수 있어야 했습니다.
MultiSearcher를 사용했기 때문에
각 Searcher들이 바라보고 있는 Index파일들을 모두 체크하여
인덱스 파일이 변경되었을 경우 Index파일을 다시 열어서 IndexSearcher를 다시 생성하는
방법을 사용하기로 하였습니다.
각 Searcher별로 가지고 있는 IndexReader를 MultiSearcher로 부터는 직접적으로 얻을 수 없었기 때문에
IndexReader를 List에 담아 보관하고, IndexSearcher를 사용 할 때 마다 IndexReader로 Index파일을 체크하여
만약 하나라도 변경된 사항이 있으면, 현재 만들어진 MultiSearcher를 날려버리고 전부 새로 IndexSearcher를 생성하여
다시 MultiSearcher를 생성하는 방식을 사용했습니다.
세부적은 성능등은 고려하지 않았는데
사용자가 극 소수이고 트래픽도 많지 않았기 때문에 이정도로도 충분하더군요...
또한 IndexSearcher는 재사용 하는 것이 좋기 때문에 , MultiSearcher를 생성 후
이를 Map에 담아두고 return해주는 방식으로 Manager 클래스를 구현하였습니다.
주요내용은 주석으로 적었습니다만.. 주요 골격은 Index 디렉토리로부터 Searcher들을 생성하여 이를 통해 MultiSearcher를 생성합니다. 그리고 재사용을 위해 Map에 저장하여 이것을 사용해 검색을 수행합니다.
현재로서는 default 라는 이름의 키만을 사용하게 되어있지요..
기본적으로 잘 다듬어진 코드는 아니지만 일단, 이정도로 Searcher를 사용하여 생성하고 있습니다.
만약, 구현하려는 부분에 짧은 주기의 색인 반영이나 Index 파일의 변경이 필요하다면
더 디테일한 구현이 필요 할 것 입니다.
이것을 테스트해보기 위해서
테스트 케이스를 작성해보았습니다.
상당히 간단한 테스트케이스입니다.
실제 정렬이라던가하는 부분은 실제 정렬 필드를 생성하여 검색을 수행하는 클래스에서 하기 때문에
저 같은 경우는 따로 테스트케이스를 만들어서 사용하고 있습니다.
이 테스트케이스는 정말로 Manager 클래스에 대한 테스트이지요.....
루씬으로 단일 색인 파일로는 15기가정도의 파일까지는 사용을 해보았지만, 다수의 Index 파일은
처음 사용하려 하는 것이고, 개발이 끝난 상태가 아니라서 사실 더 많은 정보를 얻지는 못 하였습니다.
대략적으로 개발이 어느정도 끝나가고 있어서 (주요 모듈들..)
기존에 사용하던 단일 Index 파일로부터 새롭게 사용 할 분석연도별 인덱스 파일을
생성하기 위해 마이그레이션을 진행하였는데 2009년도가 7기가, 2010년도가 12기가 정도
나오는 것 같았습니다.
이정도면 사용하면서 어느정도 성능이라던가
추가적은 내용에 대한 공부가 될 수 있을 것 같네요...
대략적으로 MultiSearcher의 사용에 대해서 적어보았습니다.
루씬에 처음 다가서시려는 분들께 조금이나마 도움이 되었으면 좋겠네요...