我正在测试lucene中的排序功能而没有运气。我是新手。 我尝试过使用TopFieldCollector或TopFieldDocs,但似乎没有应用排序。 下面是测试代码。它出什么问题了?
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
答案 0 :(得分:1)
问题是您将“num”字段添加为String,然后尝试将其排序为整数。您应该将其添加为整数(使用NumericField)或排序为String(但要注意它将根据字典顺序排序)。