검색 엔진2013.05.24 00:19

이번에 알아볼것은 필드 데이타 저장이다.

문서를 만들때 아래 처럼 하는데 new Field의 세번째 인자 Field.Store.YES를 주목 하자


즉 해당 필드 데이타를 메타에 저장할건지 말건지에 대한 인자이다.

색인만 하는 필드가 있을수 있고, 메타데이타 저장만 할 필드가 있을 수 있고, 두개를 다 할 필드가 있을것이다.

Field.Store.NO로 되어 있으면 나중에 검색 결과를 받을때, 해당 필드의 정보는 볼수 없다.


뭐 여담으로 Lucene으로 검색 결과로 문서 번호만 가져오고,

메타 정보는 몽고나 카산드라 같은걸 이용 할 수도 있다.


IndexWriter의 JavaDoc문서를 보면 "IndexWriter instances are completely thread safe" 라고 해서 관련된 로직이 있는데

이거에 대해서는 다음에 알아 보도록 하고(어마어마하다. 당최 이해가 안되네요;;;, 왜 thread safe지?)
이번 포스트에서는 Field.Store.YES가 어떻게 처리되는지에 대해서 알아보도록 한다.


IndexWriter.addDocument -> DocumentsWriter.updateDocument -> DocFieldProcessorPerThread.processDocument -> StoredFieldsWriterPerThread.addField -> FieldsWriter.writeField



Hacking Lucene과 위 메소드를 종합해보면 .fdt 색인 파일은 다음과 같이 구현되었다



문서 포인터를 저장하고 있는 .fdx 는 다음과 같이 구현되었다.


다음 포스트에는 consumer, state가 어떤구조로 구현이 되었는지, *PerThread들은 어떻게 구현했는지

그리고 색인 필드 데이타 저장하는데 사용된 class들은 어떤 구조인지 (할수있을지 모르겠지만....) 알아본다.

Posted by 오산돌구