gpt4 book ai didi

c# - Lucene.NET 没有删除文档?

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:37 25 4
gpt4 key购买 nike

我可能经历过无数次 S.O.关于这个问题的帖子,但我很茫然,无法弄清楚问题是什么。

我可以在索引中添加和更新文档,但我似乎无法成功删除它们。

我正在使用 Lucene.NET v3.0.3

我读到一个建议是使用相同的条件进行查询 并确保我得到返回的结果。好吧,我这样做了:

首先,我有一个方法可以返回数据库中已标记为已删除的项目

var deletedItems = VehicleController.GetDeleted(DateTime lastcheck);

目前在测试期间,这包括一个项目。然后我迭代:

// This method returns my writer
var indexWriter = LuceneController.GetWriter();

// And my searcher
var searcher = new IndexSearcher(indexWriter.GetReader());

// And iterate over my items (just one for testing)
foreach(var c in deletedItems) {

// Here I'm testing by doing a query
var query = new BooleanQuery();
query.Add(new TermQuery(new Term("key", c.Guid.ToString())), Occur.MUST);

// Let's see if it can find the record based on this
var docs = searcher.Search(query, 1);

var foundDoc = docs.FirstOrDefault();

// Yep, we have one... let's get the full doc to be sure
var actualDoc = searcher.Doc(foundDoc.Doc);

// If I inspect actualDoc, it's the right one... I want to delete it.
indexWriter.DeleteDocuments(query);
indexWriter.Commit();

}

我已经尝试把上面的所有逻辑都打碎了,这样更容易阅读,但是我已经尝试了各种方法......

indexWriter.Optimize();
indexWriter.Flush(true, true, true);

如果我查看存储所有内容的实际文件夹,我可以看到像 0_1.del 这样的文件名和类似弹出窗口的东西,这看起来很有希望。

然后我在某处读到有关合并策略的信息,但这不是 Flush 应该做的吗?

然后阅读尝试将优化方法设置为最大 1,但仍然无效(即 indexWriter.Optimize(1))。

因此使用相同的查询来获取有效,但删除无效。为什么?我还能检查什么?删除实际上是永久删除该项目还是以其他方式继续存在,直到我完全删除正在使用的目录?不理解。

最佳答案

Lucene 中的索引段文件是不可变的,它们一旦写入就永远不会改变。因此,当记录删除时,删除的记录实际上并没有立即从索引文件中删除,只是将记录标记为已删除。一旦合并该索引段以生成新段,该记录最终将从索引中删除。即删除的记录不会在合并结果的新段中。

理论上,一旦 commit 被调用,删除就应该从读者的 View 中移除,因为你是从作者那里得到读者(即它是一个实时读者)这记录在这里:

Note that flushing just moves the internal buffered state in IndexWriter into the index, but these changes are not visible to IndexReader until either commit() or close() is called.

来源:https://lucene.apache.org/core/3_0_3/api/core/org/apache/lucene/index/IndexWriter.html

但您可能想在删除发生后尝试关闭读取器,然后从写入器处获取一个新读取器,以查看该新读取器现在是否已将记录从可见性中删除。

关于c# - Lucene.NET 没有删除文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57663397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com