2

我正在测试 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
4

1 回答 1

1

问题是您将“num”字段添加为字符串,然后尝试将其排序为整数。您应该将其添加为整数(使用 NumericField)或排序为字符串(但请注意它将根据字典顺序进行排序)。

于 2012-08-14T14:13:43.123 回答