Java

Lucene3.1 メモその1 – ドキュメントのインデックスを作成して検索する

最近Luceneを触っています。
Luceneについて大抵のことはLucene入門に書いてあるけれども非推奨になっているAPIも結構あります。
そこで最新のLucene3.1で警告なしにコンパイルが通るサンプルプログラムをちょこちょこ掲載していきたいと思います。

まず最初は基本中の基本、インデックス作成と検索。
以下のことをやるプログラムです。
・メモリ上(RAMDirectory)にインデックスを格納
・英語と日本語のドキュメント2つ分のインデックスを作成
→ Document オブジェクトにaddメソッドで検索対象のフィールドを追加していく
→ Luceneにインデックスだけでなく値を保存しておきたいときはFieldのコンストラクタにField.Store.YESを指定する
→ フィールドを解析(トークナイズ)しておきたい場合はField.Index.ANALYZEDを指定する
・英単語で検索、1件ヒットする
→ IndexSearcherのsearchメソッドで検索、TopDocsオブジェクトが返る
→ TopDocsオブジェクトにはヒットしたドキュメントの件数や、ドキュメントのIDが格納されている
→ ドキュメント自体を取り出すにはIndexSearcher.doc(int)を使う

    @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", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("str_field", "貴社の記者が汽車で帰社した",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
writer.close();
IndexSearcher searcher = new IndexSearcher(directory, true);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(1));
Document doc3 = searcher.doc(td.scoreDocs[0].doc);
assertEquals("quick brown fox jumped over the lazy dog.", doc3.get("str_field"));
searcher.close();
directory.close();
}

すぐ試せるmavenベースになってるソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその2 – ドキュメントを追加する – 侍ズム
Lucene3.1 メモその3 – ドキュメントを更新する – 侍ズム
Lucene3.1 メモその4 – 検索結果をソートする – 侍ズム
Lucene3.1 メモその5 – 数値型のフィールドを設定する – 侍ズム
Lucene3.1 メモその6 – 日本語のドキュメントを検索する – 侍ズム
Lucene3.1 メモその7 – 形態素解析をして日本語のドキュメントを検索する – 侍ズム

[amazonjs asin=”4774127809″ locale=”JP” tmpl=”Small”][amazonjs asin=”4774141755″ locale=”JP” tmpl=”Small”]