[Lucene] Field options for term vectors

일반적인 용도는 다음과 같다.
1. 검색어와 일치하는 token에 대해 highlighting을 할 필요가 있을 때 사용한다.
2. 유사한 문서를 찾을 때 유용하다 <-(이거야 ^ㅠ^ㅋㅋㅋ)

Term Vector 정의
term vector들은 indexed field와 stored field의 혼합 형태로 찾고자 하는 document에 대해서 모든 term vector들을 빠르게 찾을 수 있기 때문이 일종의 저장된 field와 비슷한 형태다.

term vector들는 우선 document Id 에 key 된다.
그리고 term에 의해  key 되는데 이것이 의미하는 것은 document의 작은 형태의 inverted index(역 인덱스)가 저장되는 형태라고 생각하면 된다.

term vector가 original string을 저장하는 stored filed와 다른 점은 term vector들은 analyzer에 의해 만들어진 term들을 저장한다.

저장된 term들은 document 내에서 검색어와 일치하는 도수(frequency), 사전 순서에 따라 결과 값을 검색 할 수 있게 만들어 준다.

Lucene의 책에 있는 것보다 주석에 나와 있는 설명이 보다 이해하기 쉽다.

TermVector.YES : 각각의 document에 대한 term vector들을 저장한다. term vector는 document들의 term들과 document에 나타난 빈도수 정보의 list 형태이다.

TermVector.NO : term vector들을 보관하지 않는다.

TermVector.WITH_POSITIONS : term vector 정보와  token position 정보를 보관한다.

TermVector.WITH_OFFSETS : term vector 정보와 token offset 정보를 보관한다.

TermVector.WITH_POSITIONS_OFFSET : term vector와 token posision, offset 정보를 보관한다.

주의사항이 있다는데 term vector들을 field 용도로 indexing 하려고 하지 않는 이상 색인(index)할 수 없다고 한다.

추가로 Index.NO를 선택하게 되면은 반드시 TermVector.NO를 선택해야 함을 잊지 말자.
Indexing이 되지 않는데 TermVector를 추출할 필요가 없기 때문이다.
향후 custom search engine을 만들면서 색인할 document modeling validation시에 check할 필요가 있으며 XML schema를 설계할 때 고려해야 할 것이다.

품질이 높은 검색엔진을 만들기 위해서는 Lucene을 깊게 이해할 필요가 있을 것 같다.

[Lucene] Analyzer 소스코드 분석

Lucene 3.6을 기준으로 공부 하였다.
상단 주석 설명 내용을 기준으로 보면
Analyzer 클래스는 Abstract class로 text를 분석할 TockenStream을 만든다.
이건은 text로부터 index term을 추출하기 위한 정책(방법이나 전략)을 표현하기도 한다.
reader는 문자 stream을 가공되지 않은 token 형태로 나눈다.
TokenFilter는 Tokenizer의 output에 적용된다.
CollectionKeyAnalyzer를 예를 들면 다음과 같은 형태이다.

public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream result = new KeywordTokenizer(reader);
result = new CollationKeyFilter(result, collator);
return result;
}

여러가지 형태의 Analyzer를 이용하여 동사, 명사, phrase 들을 분석하고 추출하여 term을 만들 수 있다.