1

配列には、検索からのScoreDoc[]すべてのドキュメント ID が含まれます。これらのドキュメント ID を使用して、単一のドキュメントを更新したいと考えています。この特定の例では、更新したい行を一意に識別できません。これは、与えられた用語が複数のドキュメントに一致することになるためです。

1:a、2:b、および次のドキュメントが返されるクエリを想像してください。

       1 2 3 4 5 6
doc 1: a b c d e f
doc 2: a b g h i j
doc 3: a b k l m n

基本的にフィールド 3 と 4 を更新していますが、5 と 6 はそのままにしておきたいです。

現在、これらの行を取得して必要な更新を行うことができますが、インデックスでそれらを更新する方法がわかりません。

anindexWriter.updateDocuments(...)または anindexwriter.DeleteDocuments(...)により、ドキュメント 1、2 3 が削除されます。

私は documentId を持っているので、それを使ってインデックスを更新する方法があると思います。

4

2 に答える 2

6

Lucene では、ドキュメント内のフィールドの更新は許可されていません。これは厳密には削除/追加メカニズムです。

ドキュメントの docId は、最適化やマージなどの際に変更される可能性があるため、常に同じであることに依存することは望ましくありません。時間の経過とともに変化しない独自のフィールドをドキュメントに配置し、代わりにそれを使用する必要があります。

于 2013-10-04T18:21:16.850 に答える
1

docid で削除するメソッドがあります: IndexWriter.tryDeleteDocumentです。ドキュメントを削除したら、新しいドキュメントを追加できます。これは、他の人が述べているように、Lucene が更新を実行する方法です。

上にリンクされているドキュメントは、 try DeleteDocumentと呼ばれる理由に関するいくつかの興味深い情報を提供します。

于 2013-10-04T22:28:35.970 に答える