【问题标题】:Lucene.NET update not removing search termsLucene.NET 更新不删除搜索词
【发布时间】:2011-06-04 00:24:13
【问题描述】:

我正在将 Lucene.NET 用于一个项目,并且创建索引/搜索索引非常顺利。但是,当我更新时,我似乎只添加 到搜索索引,而不是从索引中删除 项。从头开始重建索引可以解决问题,但显然我不希望每次有人修改值时都这样做。

  • 例如,假设我们已使用字段 FieldB 为 DocumentA 建立索引,其中包含文本“这是要索引的一些文本”。
  • 搜索“fantastic”这个词没有结果。
  • 现在,我们将 DocumentA 的 FieldB 更新为“这是一些很棒的要索引的文本。”
  • 搜索“fantastic”一词会产生 DocumentA 作为结果(如预期的那样)。
  • 将 DocumentA 的 FieldB 更新为“这是一些要索引的平庸文本。”
  • 搜索“平庸”会产生 DocumentA 作为结果(如预期的那样)。
  • 搜索“fantastic”结果仍然是 DocumentA。这不是我期望或想要的行为。

这是我用来更新文档的方法(更改了类名以保护无辜者):

internal static void ModifyDocuments(IEnumerable<SomeFancyObject> changed)
{
    if (changed.Count() == 0) {
        return;
    }

    var dir = FSDirectory.Open(LuceneGlobals.directory);
    var writer = new IndexWriter(dir, LuceneGlobals.analyzer, false, new IndexWriter.MaxFieldLength(int.MaxValue));

    foreach (var fancyObj in changed) {
        //writer.DeleteDocuments(new Term("fancyID", fancyObj.ID.ToString()));
        //writer.AddDocument(CreateDocument(fancyObj));
        writer.UpdateDocument(new Term("fancyID", fancyObj.ID.ToString()), CreateDocument(index));
    }

    writer.Optimize();
    writer.Close();
}

请注意,我已经尝试了编写的代码,并且注释掉了 Delete/Add 来代替 Update 调用。我还尝试用writer.Commit(); 代替writer.Optimize();

调试显示整个方法已执行,CreateDocument() 创建了一个包含我希望看到的数据的新文档。为了完整起见,这里是CreateDocument()

private static Document CreateDocument(SomeFancyObject fancyObj)
{
    var doc = new Document();

    doc.Add(new Field("docType", "SomeFancyObject", Field.Store.YES, Field.Index.NOT_ANALYZED));

    doc.Add(new Field("fancyID", Convert.ToString(fancyObj.ID), Field.Store.YES, Field.Index.NO));
    doc.Add(new Field("fancyText", new StringReader(fancyObj.Text)));
    doc.Add(new Field("fancyTitle", new StringReader(fancyObj.Title)));

    return doc;
}

我在fancyObj.TextfancyObj.Title 看到了我期望看到的东西。也许我在这里没有正确使用所有选项?

需要做些什么来防止我的索引记住已更新的数据?

【问题讨论】:

    标签: indexing lucene.net


    【解决方案1】:

    您需要索引 (Field.Index.NOT_ANALYZED) fancyID。 IndexWriter.UpdateDocument 删除所有具有匹配项的项,但除非您为其编制索引,否则不会生成任何项。

    您还可以考虑从 FieldCache 读取值,而不是存储它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多