【问题标题】:Lucene.NET - Can't delete docs using IndexWriterLucene.NET - 无法使用 IndexWriter 删除文档
【发布时间】:2011-08-24 07:27:49
【问题描述】:

我正在接手一个项目,所以我还在学习这个。该项目使用 Lucence.NET。我也不知道这个功能是否正确。无论如何,我正在实例化:

var writer = new IndexWriter(directory, analyzer, false);

具体文件,我打电话:

writer.DeleteDocuments(new Term(...));

最后,我调用的是通常的 writer.Optimize()、writer.Commit() 和 writer.Close()。

Term 对象中的字段是一个 Guid,转换为字符串 (.ToString("D")),并使用 Field.Store.YES 和 Field.Index.NO 存储在文档中。

但是,通过这些设置,我似乎无法删除这些文档。目标是删除,然后添加更新的版本,所以我得到了同一个文档的副本。如果需要,我可以提供更多代码/解释。有任何想法吗?谢谢。

【问题讨论】:

    标签: c# asp.net indexing lucene lucene.net


    【解决方案1】:

    我不认为你对待作者的方式有什么问题。

    听起来好像您传递给 DeleteDocuments 的术语没有返回任何文档。您是否尝试过使用相同的术语进行查询以查看它是否返回任何结果?

    另外,如果您的目标是简单地重新创建文档,您可以调用 UpdateDocument:

    //     Updates a document by first deleting the document(s) containing term and
    //     then adding the new document. The delete and then add are atomic as seen
    //     by a reader on the same index (flush may happen only after the add).  NOTE:
    //     if this method hits an OutOfMemoryError you should immediately close the
    //     writer. See above for details.
    

    您可能还想查看 SimpleLucene (http://simplelucene.codeplex.com) - 它可以更轻松地完成基本的 Lucene 任务。

    [更新] 不知道我是怎么错过的,但@Shashikant Kore 是正确的,您需要确保该字段已编入索引,否则您的术语查询将不会返回任何内容。

    【讨论】:

      【解决方案2】:

      该字段必须被索引。如果一个字段没有被索引,它的术语将不会出现在枚举中。

      【讨论】:

      • 在我做了更多研究后,我意识到并测试了这一点。我索引了该列,重建了它,现在文档被正确删除了。谢谢。
      • 我看到了同样的问题,但我不明白您所说的“必须为字段编制索引”是什么意思。你能澄清一下吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      相关资源
      最近更新 更多