루씬의 주요한 함수를 꼽으라면
데이터를 인덱싱하는 IndexWriter
데이타를 검색하는 IndexSearcher
데이타를 읽는 IndexReader
이 세개를 말할수 있습니다.
단순한 검색서비스를 제공하고자 한다면 IndexWriter와 IndexSearcher 이 두개만 있으면 됩니다.
이 세가지의 공통점을 꼽는다면
모두가 동일한 Directory를 바라보고 있다는 겁니다.
개별로 움직이는 것들이 하나의 Directory를 가지고 지지고 볶고 합니다.
그렇지만 이 세개는 아쉽게도 서로 사용시 Sync를 맞추지 못합니다.
동상이몽하는 셈이죠.
하나의 변경이 다른 것에 영향을 미치지 못하고 지가 보고 있는 허상만을 건들고 있다는 겁니다.
즉, IndexWriter가 인덱싱을 하는데 이넘의 IndexReader나 IndexSearcher는 그 사실을 알지 못합니다.
snapshot이라고 해야 하나요. 자기가 처음 인스턴스를 생성했을때 그 모습만을 바라보고 있습니다. 새로운 인덱싱이 추가되었는지 알지 못해요. 그래서, 데이터를 추가했는데 검색안된다고 아우성입니다.
그렇기 때문에 추가된 사항을 반영하려면 항상 필요할때마다 반복해서 인스턴스(Directory를 읽기위한)를 생성해야 합니다.
이러다 보니 실시간으로 처리하는 데이터 입출력 시스템에서는 별로 유효하지 않습니다.
엄청난 노가다를 해야 하는 셈이죠^^
참고로 이 루씬의 Directory는 하나의 문서를 표현하는 Document들로 구성되어 있으며
이 Document를 이루는 개별 필드인 Field로 구성되어 있습니다.
물론 데이터 관점에서 이런것이고 그 이외에 필요한 여러 파일들이 존재하고 있죠.
위의 3가지 IndexWriter, Reader, Searcher와 Document, Field의 개념만 알고 있어도 루씬을 사용하는데 아무런 지장이 없습니다.
문제는 많은 분들이 위에서 지적한 snapshot의 원리를 기억하지 못하고 헤멘다는 겁니다.^^
