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

时间:2011-11-17 15:21:34

标签: java lucene

要删除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的情况下进行。

1 个答案:

答案 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已经打开,那么它将不起作用,所以也许它不适用于您的情况。