【发布时间】: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.Text 和fancyObj.Title 看到了我期望看到的东西。也许我在这里没有正确使用所有选项?
需要做些什么来防止我的索引记住已更新的数据?
【问题讨论】:
标签: indexing lucene.net