IndexWriter 所做的更改不会被 IndexReader 反映

Changes made by an IndexWriter are not reflected by an IndexReader

我有一个处于只读模式的 IndexReader,一个基于此 reader 的 IndexSearcher 和一个在同一个 Lucene 索引上工作的 IndexWriter。我想从索引中删除一个文档。之后,我不希望文档出现在 IndexSearcher 编辑的结果中 return(我想这就是删除的意义所在)。这是代码:

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

但是,删除的文档仍然return作为结果编辑,直到一切都重新启动,即 writer、reader 和 searcher 被重新实例化。此外,像这样在查询中整理已删除的文档也不起作用:

if (_enIndexReader.IsDeleted(documentId)) continue;

被删除的文档还有return false for IndexReader.IsDeleted(Document).

如何以最小的计算成本在 IndexSearcher/IndexReader 中反映 IndexWriter 所做的更改?删除后重新实例化所有内容不是一种选择。

我使用 Lucene.NET v4.0.30319.

知道了。 IndexReader.Reopen() returns 调用方法的 reader 的重新打开的实例,同时保持原样。因此,代码需要这样修改:

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