0

我正在使用updateDocument()方法来更新我在 lucene 索引中的文档。这是我的做法。

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

我用 Luke 检查了我的索引数据,发现在第二次索引运行时,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 回答