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 に答える