我的IndexReader
处于只读模式,IndexSearcher
基于此阅读器,IndexWriter
处理相同的Lucene索引。我想从索引中删除文档。之后,我不希望文档显示在IndexSearcher
返回的结果中(我想是删除的内容)。这是代码:
_enIndexWriter.DeleteDocuments(query);
_enIndexWriter.Commit();
_enIndexReader.Reopen();
_enIndexSearcher = new IndexSearcher(_enIndexReader);
但是,删除的文档仍会作为结果返回,直到重新启动所有内容,即重新实例化编写器,阅读器和搜索器。此外,查询中的已删除文档并不起作用,如下所示:
if (_enIndexReader.IsDeleted(documentId)) continue;
已删除的文档仍会返回false
的{{1}}。
如何以最低的计算成本反映IndexReader.IsDeleted(Document)
/ IndexWriter
中IndexSearcher
所做的更改?删除后重新实例化所有内容都不是一种选择。
我使用的是Lucene.NET v4.0.30319。
答案 0 :(得分:1)
知道了。 IndexReader.Reopen()
返回一个重新打开的调用该实例的读取器实例,同时保持原样。因此,代码需要像这样修改:
_enIndexWriter.DeleteDocuments(query);
_enIndexWriter.Commit();
_enIndexReader = _enIndexReader.Reopen();
_enIndexSearcher = new IndexSearcher(_enIndexReader);