[Lucene] Field option 정리

Store.YES : original String value가 index에 저장되며 IndexReader로 부터 읽어올 수 있다.
이 옵션은 검색 결과를 보여줄 때 유용하다(URL, title, DB PK 등)
단 매우 큰 fields는 저장하지 않는 것을 권장한다.
-> 저장된 fields 들이 index 저장 공간을 소모하기 때문이다.

Store.NO : 값을 보관하지 않는다. 이 옵션은 매우 큰 text fields를 index하는데 Index.ANALYZED와 함께 사용되며 original 형태의 데이터를 반환해야 할 필요가 없을 때 사용된다.(document body, web page, any type of text document)

CompressionTools를 제공하기도 하는데 내부적으로 java.util.Zip 클래스를 사용하여 lucene에서 값을 저장하기 전에 압축 시킬 수 있다. 단 index 저장 공간은 절약할 수 있으나 indexing, searching operation이 느려질 수 있다.
디스크 공간을 절약함과 맞바꿔 연산 비용(CPU cost)을 더 지불해야 한다.

만약 fields가 작다면 압축할 가치가 없다.

[Lucene] Field.setOmitTermFreqAndPositions Deprecated

Field.setOmitTermFreqAndPositions(boolean)은 일반적으로 term vector를 계산할 필요 없이 오직 filter 연산(일치 여부를 검사) 용도로 사용 한다고 하지만 Lucene 3.6 기준으로 Deprecated 되었다.

대신 setIndexOptions를 사용하기를 권하는데 소스코드를 까보면 DOCS_ONLY를 사용하면 될듯 하다.

public static enum IndexOptions {
/** only documents are indexed: term frequencies and positions are omitted */
DOCS_ONLY,
/** only documents and term frequencies are indexed: positions are omitted */
DOCS_AND_FREQS,
/** full postings: documents, frequencies, and positions */
DOCS_AND_FREQS_AND_POSITIONS
};

이글을 쓴 시점에서 테스트코드를 짜보지 않은 상황임으로 사용하기 전에 테스트 코드를 먼저 짜보길 권한다.

[Lucene] Field Option 정리

Index.ANALYZED : Analyzer를 이용하여 Field의 value 값을 stream으로 이루어진 token으로 분리하고 각각을 검색 가능한 형태로 만든다. 이 옵션은 일반적인 text fields(such as body, title, abstract)에 사용된다.

Index.NOT_ANALYZED : 해당 field를 분석하지 않는 대신에 Field의 전체 값을 단일 token으로 다루며 검색 가능하게 만든다.
이 옵션은 tokenize되지 않아야 하는 fields (URL, file system path, date, 이름, SSN(Social Security Number), 전화번호)에 사용한다. 갈기갈기 나눠져서 분석될 필요가 없는 필드에 사용하며 한마대로 검색에서 정확한 match operation에 사용한다.

Index.ANALYZED_NO_NORMS : Index.ANALYZED의 변형 형태로 index에 norms information을 보관하지 않는다.
norms : index에 boost information으로 index-time을 보관한다.

Index.NOT_ANALYZED_NO_NORMS : Index.NOT_ANALYZED와 비슷하지만 norms 을 보관하지 않는다. 이 옵션은 검색시 index 저장 공간과 메모리 사용량을 절역하는데 사용된다. 그리고 single-token field 들은 norm 정보를 필요로 하지 않다.
(single-token : URL, file path와 같은 경우는 유사도를 비교할 필요가 없지 않을까?)

Index.NO : field 값을 검색 가능하지 않도록 만든다.