2
lucene의 기능을 정렬없이 테스트하고 있습니다. 나는 그것에 익숙하지 않다. TopFieldCollector 또는 TopFieldDocs를 사용해 보았지만 정렬이 적용되지 않은 것 같습니다. 테스트 코드 아래에 있습니다. 그게 뭐가 잘못 됐어?점수를 통해 lucene를 정렬하십시오.
private void testNumericSorting(){
// 1. index some data
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);
IndexWriter w = new IndexWriter(index, config);
addDoc(w, "orange", 1);
addDoc(w, "lemon orange", 10);
w.close();
// 2. query
String querystr = "orange";
Query q = new QueryParser(Version.LUCENE_35, "title", analyzer).parse(querystr);
int hitsPerPage = 10;
IndexSearcher searcher = new IndexSearcher(index, true);
// Normal score, with no sorting
//TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
//searcher.search(q, collector);
//ScoreDoc[] hits = collector.topDocs().scoreDocs;
// Score with TopFieldCollector
Sort sort = new Sort(new SortField[] {
SortField.FIELD_SCORE,
new SortField("num", SortField.INT) });
TopFieldCollector topField = TopFieldCollector.create(sort, hitsPerPage, true, true, true, false);
searcher.search(q, topField);
ScoreDoc[] sortedHits = topField.topDocs().scoreDocs;
// Score with TopFieldDocs
// TopFieldDocs topFields = searcher.search(q, null, hitsPerPage, sort);
// ScoreDoc[] sortedHits = topFields.scoreDocs;
System.out.println("Found " + sortedHits.length + " hits.");
for(int i=0;i<sortedHits.length;++i) {
int docId = sortedHits[i].doc;
float score = sortedHits[i].score;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get("title")+ " score:"+score);
}
searcher.close();
}
private static void addDoc(IndexWriter w, String value, Integer num) throws IOException {
Document doc = new Document();
doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
//doc.add(new NumericField("num", Field.Store.NO, false).setIntValue(num));
doc.add(new Field ("num", Integer.toString(num), Field.Store.NO, Field.Index.NOT_ANALYZED));
w.addDocument(doc);
}
만약에 내가 다음과 같은 출력 (기본적으로 변화 없음)를 얻을 정렬없이 인쇄 결과 :
Without sorting, found 2 hits.
1. orange score:0.5945348
2. lemon orange score:0.37158427
With sorting, found 2 hits.
1. orange score:0.5945348
2. lemon orange score:0.37158427
NumericField (addDoc 함수에 주석 행이 있음)와 정수로 정렬되어 있지만 여전히 작동하지 않습니다. NumericField를 사용하면 생성자가 Field.Index.NOT_ANALYZED ("false"만 허용)를 사용할 수 없습니다. 이것이 문제가 될 수 있습니까? – Daniele
"true"를 마지막 NumericField 생성자 인수로 사용해야합니다. 이렇게하면 정렬해야하는 필드의 색인이 생성됩니다. – jpountz