본문 바로가기

Lucene

루씬 Score.


루씬 2.4로 넘어오면서

Hits 객체로 검색 결과를 받아오던 방식이

TopDocCollector를 이용하는 방식으로 변경되면서

Score를 조회했을때 그 Score가 이전 버전과는 다르게 나왔었습니다.

예전에는 0 ~ 1사이로 정규화가 되었었는데

지금은 아니더라구요. 왜 그러지 궁금해 하면서도 그냥 넘어가고 있었는데

마침 메일링 리스트에 관련된 내용이 올라왔네요.


일단, 현재 2.4 버젼에서 검색 후 검색된 Document의 Score를 얻는 방법은

아래와 같습니다.

 TopDocCollector collector = new TopDocCollector(10);
 searcher.search(query, collector);
 ScoreDocs[] hits= collector.topDocs().scoreDocs;
 int docId = hits[1].doc;
 Document document = searcher.doc(docId);
 Float score = hits[1].score

Float score = hits[1].score
이부분에서 나오는 Score는 Raw 데이터입니다.

즉, 정규화를 추가로 해줘야 이전버젼에서 받아오던

그런 점수를 얻을 수 있죠.

방법은 아래와 같습니다.

TopDocCollector collector = new TopDocCollector(999999);
searcher.search(query, collector);
TopDocs td = collector.topDocs();
ScoreDocs[] hits = td.scoreDocs;
int docId = hits[1].doc;
Document document = searcher.doc(docId);
float score = hits[1].score / td.getMaxScore();


topDocs로부터 가장 높은 점수를 얻어와서 그걸로 나누어주면 되네요..