要删除Lucene上的文档,可以使用带有查询和/或条款的函数indexWriter.deleteDocuments(...)。 这很好。
但是,我需要浏览一组文档,并根据条件删除其中一些文档。 我可以在Document中添加一个唯一的id字段,并根据这个唯一的id调用indexWriter.deleteDocuments(...)。 但是,我想避免使用此选项,而是执行类似的操作:
TopDocs hits = indexSearcher.search(...);
for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = indexSearcher.doc(scoreDoc.doc);
if (...) {
indexWriter.delete(doc); // or similar
}
}
有可能吗?
ps:再次,我知道我可以在文档中添加唯一的id字段, 并通过基于此唯一ID调用indexWriter.deleteDocuments(...)来删除循环内的文档。 那会很好。但是,我问如果没有这个选项可以做到这一点。 请不要回答这是否是正确的方法。这是一个有趣的讨论,但这不是这篇文章的目标。 如果没有添加唯一ID,请回答是否可能(以及如何)。
pss:我知道我在重复自己,但我会再说一遍,因为我担心我会得到与这篇文章的目标无关的答案。 真的,请关注是否有可能(以及如何)在没有添加唯一ID的情况下进行。答案 0 :(得分:1)
您可以从IndexReader
转而来。
TopDocs hits = indexSearcher.search(...);
for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = indexSearcher.doc(scoreDoc.doc);
if (...) {
indexSearcher.getIndexReader().deleteDocument(doc);
}
}
如果您IndexWriter
已经Directory
已经打开,那么它将不起作用,所以也许它不适用于您的情况。