2012-08-13 3 views
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 

답변

1

문제는 당신이 String로서 "NUM"필드를 추가하고 노력하고 있다는 것입니다 그것을 정수로 정렬합니다. NumericField를 사용하여 정수로 추가하거나 String으로 정렬해야합니다 (단, 사전 식 순서에 따라 정렬됩니다).

+0

NumericField (addDoc 함수에 주석 행이 있음)와 정수로 정렬되어 있지만 여전히 작동하지 않습니다. NumericField를 사용하면 생성자가 Field.Index.NOT_ANALYZED ("false"만 허용)를 사용할 수 없습니다. 이것이 문제가 될 수 있습니까? – Daniele

+0

"true"를 마지막 NumericField 생성자 인수로 사용해야합니다. 이렇게하면 정렬해야하는 필드의 색인이 생성됩니다. – jpountz

관련 문제