2017-02-16 5 views
2

数値フィールドに基づいて検索結果を並べ替える必要があります。 次のコード例では、「年齢」フィールドに基づいてソートする必要があります。 私からの回答を使用してから起動します。Luceneの数値フィールドをソートする方法6

[How to sort IntPont or LongPoint field in Lucene 6

をしかし、それはソートSCOREをベースありません。年齢はまだ上昇していません。

そして

[Sorting search result in Lucene based on a numeric field

私は検索機能でSortField.Type.LONGにSortField.Type.SCOREを変更しました。 しかし、私は得る:私たちが見ることができるように文字列をされて仕分け、

public class TestLongPointSort { 


    public static void main(String[] args) throws Exception { 

     String indexPath = "/tmp/testSort"; 
     Analyzer standardAnalyzer = new StandardAnalyzer(); 
     Directory indexDir = FSDirectory.open(Paths.get(indexPath)); 
     IndexWriterConfig iwc = new IndexWriterConfig(standardAnalyzer); 

     iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND); 

     IndexWriter masterIndex = new IndexWriter(indexDir, iwc); 

     Document doc = new Document(); 

     String name = "bob"; 
     doc.add(new TextField("name", name, Field.Store.YES)); 
     doc.add(new SortedDocValuesField("name", new BytesRef(name))); 
     doc.add(new SortedNumericDocValuesField("age", 20L)); 
     doc.add(new StoredField("age", 20L)); 
     long ts = System.currentTimeMillis(); 
     doc.add(new SortedNumericDocValuesField("ts", ts)); 
     doc.add(new StoredField("ts", ts)); 
     masterIndex.addDocument(doc); 
     Thread.sleep(1); 

     name = "max"; 
     doc = new Document(); 
     doc.add(new TextField("name", name, Field.Store.YES)); 
     doc.add(new SortedDocValuesField("name", new BytesRef(name))); 
     doc.add(new SortedNumericDocValuesField("age", 19L)); 
     doc.add(new StoredField("age", 19L)); 
     ts = System.currentTimeMillis(); 
     doc.add(new SortedNumericDocValuesField("ts", ts)); 
     doc.add(new StoredField("ts", ts)); 
     masterIndex.addDocument(doc); 
     Thread.sleep(1); 

     name = "jim"; 
     doc = new Document(); 
     doc.add(new TextField("name", name, Field.Store.YES)); 
     doc.add(new SortedDocValuesField("name", new BytesRef(name))); 
     doc.add(new SortedNumericDocValuesField("age", 21L)); 
     doc.add(new StoredField("age", 21L)); 
     ts = System.currentTimeMillis(); 
     doc.add(new SortedNumericDocValuesField("ts", ts)); 
     doc.add(new StoredField("ts", ts)); 
     masterIndex.addDocument(doc); 

     masterIndex.commit(); 
     masterIndex.close(); 

     IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(indexPath))); 
     IndexSearcher searcher = new IndexSearcher(reader); 

     Analyzer analyzer = new KeywordAnalyzer(); 
     QueryParser queryParser = new QueryParser("message", analyzer); 

     Sort sort; 
     TopDocs docs; 
     sort = new Sort(new SortField("name", SortField.Type.STRING)); 
     docs = searcher.search(new MatchAllDocsQuery(), 100, sort); 
     System.out.println("Sorted by name"); 
     for (ScoreDoc scoreDoc : docs.scoreDocs) { 
      Document doc2 = searcher.doc(scoreDoc.doc); 
      System.out.println("Name:" + doc2.get("name") + " ; age:" + doc2.get("age") + " ; ts:" + doc2.get("ts")); 
     } 

     //docs = searcher.search(new MatchAllDocsQuery(), 100, new Sort(new SortField("age", SortField.Type.SCORE, true))); 
     docs = searcher.search(new MatchAllDocsQuery(), 100, new Sort(new SortField("age", SortField.Type.LONG, true))); 
     System.out.println("Sorted by age"); 
     for (ScoreDoc scoreDoc : docs.scoreDocs) { 

      Document doc2 = searcher.doc(scoreDoc.doc); 
      System.out.println("Name:" + doc2.get("name") + " ; age:" + doc2.get("age") + " ; ts:" + doc2.get("ts")); 
     } 

     reader.close(); 

    } 
} 

予想外docvaluesは、ここに私のコードをフィールドにNONE '時代'(予想= NUM​​ERIC)

を入力していません良いですが、私はどのように私の番号(長い)ソートを得ることができるかを把握していませんでした。

数値フィールドをソートする正しい方法は何ですか?

おかげ

答えて

2

SortedNumericDocValuesFieldを使用して、検索結果を並べ替えるには、あなたがSortedNumericSortFieldを使用する必要があります:

Sort sort = new Sort(new SortedNumericSortField("age", SortField.Type.LONG, true)); 
TopDocs docs = searcher.search(new MatchAllDocsQuery(), 100, sort); 
+0

実際に、私はこれも試してみました。まだエラーがあります。予期せぬdocvaluesフィールド 'age'([SORTED_NUMERIC、NUMERIC]のいずれかの予想される)のNONEを入力してください。 – moonbeam

+0

@moonbeam - この変更であなたのコード*を実行したと誤解されていて、うまくいきました。 – femtoRgon

+0

私はあなたのコードをカットしました。 Luceneのどのバージョンを使用していますか?私は6.4.1を使用しています。 – moonbeam

0

私は、ArrayListのソートの方法を使用し、その後、あなたは文書からのデータを格納するためのArrayListを使用することをお勧めではなく、別のドキュメントに保存します。

参考までに、これらのリンクをご覧ください。

SO - how to sort arraylist

JAVA ArrayList sort method sample

+0

はい、それはそのように行うことができるが、それはコピーすることを意味全体の検索結果をメモリに格納し、Luceneから外部にソートしてください。 アイデアは、Luceneが文書化したソート能力を使用することです。 この質問は、私が文字列フィールドを並べ替えることができるように、このLucene機能を使って数値フィールドをソートする方法を理解することです。 – moonbeam

関連する問題