루씬 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
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);
searcher.search(query, collector);
TopDocs td = collector.topDocs();
ScoreDocs[] hits = td.scoreDocs;
ScoreDocs[] hits = td.scoreDocs;
int docId = hits[1].doc;
Document document = searcher.doc(docId);
Document document = searcher.doc(docId);
float score = hits[1].score / td.getMaxScore();
topDocs로부터 가장 높은 점수를 얻어와서 그걸로 나누어주면 되네요..