Java 在TopDocs.scoreDocs循环中删除Lucene文档而不使用唯一id
要删除Lucene上的文档,可以使用带有查询和/或术语的函数indexWriter.deleteDocuments(…)。 那很好 但是,我需要浏览一组文档,并根据条件删除其中一些文档。 我可以在文档中添加一个唯一的id字段,并基于此唯一id调用indexWriter.deleteDocuments(…)。 但是,我希望避免使用此选项,而是执行以下操作:Java 在TopDocs.scoreDocs循环中删除Lucene文档而不使用唯一id,java,lucene,Java,Lucene,要删除Lucene上的文档,可以使用带有查询和/或术语的函数indexWriter.deleteDocuments(…)。 那很好 但是,我需要浏览一组文档,并根据条件删除其中一些文档。 我可以在文档中添加一个唯一的id字段,并基于此唯一id调用indexWriter.deleteDocuments(…)。 但是,我希望避免使用此选项,而是执行以下操作: TopDocs hits = indexSearcher.search(...); for (ScoreDoc scoreDoc : hits
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的情况下是否可能(以及如何)执行此操作。您可以通过
索引阅读器来执行此操作
TopDocs hits = indexSearcher.search(...);
for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = indexSearcher.doc(scoreDoc.doc);
if (...) {
indexSearcher.getIndexReader().deleteDocument(doc);
}
}
但是,如果在目录
上已经打开了一个IndexWriter
,它将不起作用,因此它可能不适用于您的情况