본문 바로가기

Lucene

루씬 2.9 많이 바뀌었네요...;;;;

오랜만에 개인적으로 뭘 만드느라고 다시 루씬을 만졌는데..
2.9가 릴리즈 되어 있어서
냉큼 받아서 사용하려고 해보니
많이 바뀌었네요 --;;;;

3.0으로 넘어가기 위한 준비인가....

검색 하려면 아래와 같이..

SortField sf = new SortField("count", SortField.LONG, true);
Sort sort = new Sort(sf);

Directory dir = FSDirectory.open(new File("d:/index"));
IndexSearcher searcher = new IndexSearcher(IndexReader.open(dir, true));
TopFieldCollector collector = TopFieldCollector.create(sort, 60, false, true, false, false);
searcher.search(resultQuery, collector);

TopDocs top = collector.topDocs();

int result = top.totalHits; //총 검색 결과

for(int i = 0; i < 50 && i < collector.getTotalHits(); i++) {
                Document doc = searcher.doc(hits[i].doc);
}

기본적인 모양새는 2.4 랑 비슷한데
Collector가 전부 다 뒤집어졌네요.

create메서드의 boolean 값들은 뭐가 뭔지도 잘 모르겠다는 --;;

필드 정렬은 TopFieldCollector를 사용하고 일반적인 Score에 의한 검색은 TopScoreDocCollector 를 사용하는 것 같습니다.

public static TopFieldCollector create(Sort sort, int numHits,
      boolean fillFields, boolean trackDocScores, boolean trackMaxScore,
      boolean docsScoredInOrder)
      throws IOException

TopFeildCollector의 create 메서드인데..
Sort는 정렬 할 때 사용하는 sort
numHits는 몇개 가져 올 것인지... 어차피 정렬이니 내부적으로는 다 가져오겠죠..
fillFields는 true일 경우 정렬에 사용된 필드의 값을 가져오는 것 같습니다.
FieldDoc fd = (FieldDoc)hits[i];
System.out.println(fd.fields[0]);
이런식으로 해당 필드의 값을 가져 올 수 있는데요 저 값이 false이면
위 구문을 nullpointerexception을 발생시킵니다.

trakcDocScores는 각 doc의 점수를 가져 올 것인지... 저게 false이면
hits[i].score 가 NaN으로 나옵니다.

trackMaxScore는 최고 점수를 가져 올 것인지..
docsScoredInOrder는 collector에 Score 를 set 할 수 있는데
그것과 연관이 있는 것 같습니다.

뭐가 이렇게 어려워졌니 --;;;

저 boolean 설정 값에 따라 내부적으로
여러가지 Collector를 생성해서 넘겨주게 되어있네요..

종류도 겁나 많다는 --;

잠깐 쓸라고 봤다가 여기저기 많이 뒤졌네요 헐..