Lucene IndexWriter所做的更改不会反映在IndexReader中
我有一个只读模式的Lucene IndexWriter所做的更改不会反映在IndexReader中,lucene,lucene.net,Lucene,Lucene.net,我有一个只读模式的IndexReader,一个基于该阅读器的indexsearch和一个IndexWriter在同一个Lucene索引上工作。我想从索引中删除一个文档。之后,我不希望文档显示在索引搜索器返回的结果中(我想这就是删除的意义所在)。代码如下: _enIndexWriter.DeleteDocuments(query); _enIndexWriter.Commit(); _enIndexReader.Reopen(); _enIndexSearcher = new IndexSearc
IndexReader
,一个基于该阅读器的indexsearch
和一个IndexWriter
在同一个Lucene索引上工作。我想从索引中删除一个文档。之后,我不希望文档显示在索引搜索器返回的结果中(我想这就是删除的意义所在)。代码如下:
_enIndexWriter.DeleteDocuments(query);
_enIndexWriter.Commit();
_enIndexReader.Reopen();
_enIndexSearcher = new IndexSearcher(_enIndexReader);
但是,删除的文档仍将作为结果返回,直到所有内容重新启动,即重新实例化writer、reader和searcher。此外,在查询中按如下方式对已删除文档进行排序也不起作用:
if (_enIndexReader.IsDeleted(documentId)) continue;
_enIndexWriter.DeleteDocuments(query);
_enIndexWriter.Commit();
_enIndexReader = _enIndexReader.Reopen();
_enIndexSearcher = new IndexSearcher(_enIndexReader);
对于IndexReader.IsDeleted(Document)
,已删除的文档仍然返回false
如何以最小的计算成本反映indexsearch
/IndexReader
中IndexWriter
所做的更改?删除后重新存储所有内容不是一个选项
我使用Lucene.NET v4.0.30319。明白了IndexReader.Reopen()
返回调用该方法的读取器的重新打开实例,而该实例保持原样。因此,代码需要修改如下:
if (_enIndexReader.IsDeleted(documentId)) continue;
_enIndexWriter.DeleteDocuments(query);
_enIndexWriter.Commit();
_enIndexReader = _enIndexReader.Reopen();
_enIndexSearcher = new IndexSearcher(_enIndexReader);