0

メソッドを使用updateDocument()して、luceneインデックスのドキュメントを更新しています。これが私がやっている方法です。

writer.updateDocument(new Term(Constants.DOC_ID_FIELD, doc.get(Constants.DOC_ID_FIELD)), doc);

Lukeでインデックスデータを確認したところ、インデックス作成の2回目の実行時に、Lukeがそのように指示していることがわかりましたDeleted Document - not available。したがって、基本的に、ドキュメントは削除済みとしてマークされますが、それでもインデックスに存在します。

これらのマークされた削除済みドキュメントを保持したくありません。私はそれを間違っていますか?

また、ドキュメントを更新すると、古いドキュメントが削除されてから新しいドキュメントが追加されることも理解していました。そうではありませんか?

4

2 に答える 2

2

メーリングリストから回答を得ました。

IndexWriter.updateDocument()削除してから追加します。したがって、インデックスからドキュメントが削除されます。なんで気にするの?セグメントがマージされると、最終的にはなくなります。

本当に気にする場合は、 を参照してくださいIndexWriter,forceMergeDeletes()。これについては、javadoc も参照してください。これは、多くの場合、非常にコストのかかる操作です。それが保証されることはめったにありません。

于 2012-10-17T13:46:07.537 に答える
0

以下は、インデックスからドキュメントを削除する必要があります。

public static void deleteDocumentsFromIndexUsingTerm(Term term) throws IOException, ParseException {

        System.out.println("Deleting documents with field '" + term.field() + "' with text '" + term.text() + "'");
        Directory directory = FSDirectory.getDirectory(INDEX_DIRECTORY);
        IndexReader indexReader = IndexReader.open(directory);
        indexReader.deleteDocuments(term);
        indexReader.close();

    }

参照: http://www.avajava.com/tutorials/lessons/how-do-i-delete-a-document-from-a-lucene-index-using-the-value-of-a-field.html

于 2012-10-17T11:30:14.543 に答える