基本その4,検索結果のソート
以下のことをやります
・メモリ上(RAMDirectory)にインデックスを格納
・ドキュメントを3つ追加
・ソートキーとなるフィールドを指定して検索
・ソートキーとなるフィールドを降順で指定して検索
IndexSearcher#searchにSortFieldを渡すことで検索結果をソートできます。
デフォルトでは昇順のソートになりますが、SortFieldのコンストラクタにbooleanでtrueを渡すことで降順のソートもできます。
今回はインデックスにあるドキュメント全てを取得したかったのでMatchAllDocsQueryというクラスを使いました。特に検索条件を指定しなくてもドキュメントを取り出せるので場合によっては便利です。
@Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);
Document doc = new Document();
doc.add(new Field("str_field", "abc",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("str_field", "def",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
Document doc3 = new Document();
doc3.add(new Field("str_field", "hij",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc3);
writer.commit();
IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs td = searcher.search(new MatchAllDocsQuery()
, 1000, new Sort(new SortField("str_field", SortField.STRING)));
assertThat(td.totalHits, is(3));
System.out.println(searcher.doc(td.scoreDocs[0].doc));
assertThat(searcher.doc(td.scoreDocs[0].doc).get("str_field"), equalTo("abc"));
assertThat(searcher.doc(td.scoreDocs[1].doc).get("str_field"), equalTo("def"));
assertThat(searcher.doc(td.scoreDocs[2].doc).get("str_field"), equalTo("hij"));
td = searcher.search(new MatchAllDocsQuery()
, 1000, new Sort(new SortField("str_field", SortField.STRING, true)));
assertThat(td.totalHits, is(3));
assertThat(searcher.doc(td.scoreDocs[0].doc).get("str_field"), equalTo("hij"));
assertThat(searcher.doc(td.scoreDocs[1].doc).get("str_field"), equalTo("def"));
assertThat(searcher.doc(td.scoreDocs[2].doc).get("str_field"), equalTo("abc"));
reader.close();
writer.close();
searcher.close();
directory.close();
}
すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。
関連記事:
・Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
・Lucene3.1 メモその1 – ドキュメントのインデックスを作成して検索する – 侍ズム
・Lucene3.1 メモその2 – ドキュメントを追加する – 侍ズム
・Lucene3.1 メモその3 – ドキュメントを更新する – 侍ズム
・Lucene3.1 メモその5 – 数値型のフィールドを設定する – 侍ズム
・Lucene3.1 メモその6 – 日本語のドキュメントを検索する – 侍ズム
・Lucene3.1 メモその7 – 形態素解析をして日本語のドキュメントを検索する – 侍ズム
[amazonjs asin=”4774127809″ locale=”JP” tmpl=”Small”] | [amazonjs asin=”4774141755″ locale=”JP” tmpl=”Small”] |