Java 在TopDocs.scoreDocs循环中删除Lucene文档而不使用唯一id

Java 在TopDocs.scoreDocs循环中删除Lucene文档而不使用唯一id,java,lucene,Java,Lucene,要删除Lucene上的文档,可以使用带有查询和/或术语的函数indexWriter.deleteDocuments(…)。 那很好 但是,我需要浏览一组文档,并根据条件删除其中一些文档。 我可以在文档中添加一个唯一的id字段,并基于此唯一id调用indexWriter.deleteDocuments(…)。 但是,我希望避免使用此选项,而是执行以下操作: TopDocs hits = indexSearcher.search(...); for (ScoreDoc scoreDoc : hits

要删除Lucene上的文档,可以使用带有查询和/或术语的函数indexWriter.deleteDocuments(…)。 那很好

但是,我需要浏览一组文档,并根据条件删除其中一些文档。 我可以在文档中添加一个唯一的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的情况下是否可能(以及如何)执行此操作。

您可以通过
索引阅读器来执行此操作

TopDocs hits = indexSearcher.search(...);
for (ScoreDoc scoreDoc : hits.scoreDocs) {
   Document doc = indexSearcher.doc(scoreDoc.doc);
   if (...) {
      indexSearcher.getIndexReader().deleteDocument(doc);
   }
}
但是,如果在
目录
上已经打开了一个
IndexWriter
,它将不起作用,因此它可能不适用于您的情况