IndexFader不会反映IndexWriter所做的更改

时间:2015-02-11 17:43:25

标签: lucene lucene.net

我的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) / IndexWriterIndexSearcher所做的更改?删除后重新实例化所有内容都不是一种选择。

我使用的是Lucene.NET v4.0.30319。

1 个答案:

答案 0 :(得分:1)

知道了。 IndexReader.Reopen()返回一个重新打开的调用该实例的读取器实例,同时保持原样。因此,代码需要像这样修改:

_enIndexWriter.DeleteDocuments(query);
_enIndexWriter.Commit();
_enIndexReader = _enIndexReader.Reopen();
_enIndexSearcher = new IndexSearcher(_enIndexReader);