Java

Lucene3.1 メモその3 – ドキュメントを更新する

基本その3,ドキュメントの更新

ドキュメントを「更新」というメソッドはなく、「削除→追加」という手順を追うことになります。
ドキュメントを更新するにはupdateDocumentというメソッドを使います。

ただ、一意性制約を付けて同じIDのドキュメントの追加を防ぐようなことはできないので、アプリケーション側で気をつけてドキュメントを更新してあげる必要があります。
今回は"ID"というフィールドを作って、IDフィールドをキーに更新してみました。

サンプルプログラムでは下のことをやっています
・メモリ上(RAMDirectory)にインデックスを格納
・英語ドキュメントを1つ追加
・IDを指定してドキュメントを更新
・当初のドキュメントがヒットしないことを確認
・更新した方のドキュメントがヒットすることを確認

    @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("id", "001",
Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("str_field", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.commit();
IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(1));

Document doc2 = new Document();
doc.add(new Field("id", "001",
Field.Store.YES, Field.Index.NOT_ANALYZED));
doc2.add(new Field("str_field", "quick brown fox jumped over the lazy whale.",
Field.Store.YES, Field.Index.ANALYZED));
writer.updateDocument(new Term("id", "001"),doc2);
writer.commit();

searcher.close();
reader = reader.reopen();
searcher = new IndexSearcher(reader);

td = searcher.search(parser.parse("dog"), 1000);
assertThat(td.totalHits, is(0));
td = searcher.search(parser.parse("whale"), 1000);
assertThat(td.totalHits, is(1));

writer.close();
searcher.close();
directory.close();
}

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

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその1 – ドキュメントのインデックスを作成して検索する – 侍ズム
Lucene3.1 メモその2 – ドキュメントを追加する – 侍ズム
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”]