【问题标题】:Is it possible to undelete a document in Lucene.net index?是否可以取消删除 Lucene.net 索引中的文档?
【发布时间】:2011-10-07 19:40:10
【问题描述】:

我需要从我的 Lucene 索引中删除文档,然后再重新添加它们。似乎如果我将文档标记为已删除,然后尝试再次添加它.. 文档仍然被删除。如何“取消删除”文档?

这就是我将文档标记为“已删除”的方式:

    Term = new Tearm("id", Id.Value);
    IndexSearcher.reader.DeleteDocuments(term);
    IndexSearcher.reader.Close();

所以如果我想再次“激活”这个文档.. 我该怎么做呢?

谢谢!

【问题讨论】:

  • 看来你用的Lucene.Net版本很老了(现在人们用IndexWriter的Delete方法)你用的是哪个版本的?
  • 我使用的是 2.0.0.4 版本。我没有意识到 IndexWriter 上有一个 Delete 方法。该删除是真的删除文档还是只是将其标记为已删除?
  • A) 不,2.0.0.4 中的 IndexWriter 上没有 Delete 方法。如果我没记错的话,它是在 2.3.1 中介绍的。 B)or does it just mark it deleted这是所有(AFAIK)数据库、搜索引擎的工作方式。我认为,升级到 2.9.2 或 2.9.4 后重新提问会更好

标签: c# lucene lucene.net


【解决方案1】:

我不熟悉 Lucene.Net,但是 Java 版本有IndexReader.undeleteAll() 方法。

Lucene 的删除是软删除。这意味着,当文档被删除时,它们会被标记为删除。只有在优化索引时,才会从索引中清除已删除的文档。文档列表保存在索引目录中的 .del 文件中。 undeleteAll() 方法清除文件的内容以使这些文档再次处于活动状态。 (不要尝试手动删除该文件,因为对该文件的引用保存在索引段文件中。)

您无法取消删除文档子集。您必须取消删除所有文件。您可以通过获取所有已删除文档的列表来模拟所需的功能,调用undeleteAll(),然后再次删除除您希望保留的文档之外的文档。

【讨论】:

【解决方案2】:

我认为您最好不要删除文档,而是添加一个字段以将其标记为已删除,然后将该字段从您的查询中过滤掉。除非有人也要求表单已删除的文档,否则您可以轻松地显示它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多