2015-02-11 69 views
1

我有一個IndexReader處於只讀模式,IndexSearcher基於此讀取器和IndexWriter處理相同的Lucene索引。我想從索引中刪除一個文檔。之後,我不希望文檔顯示在由IndexSearcher返回的結果中(我想這就是刪除的意思)。下面是代碼:IndexWriter所做的更改沒有反映在IndexReader中

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

但是,刪除的文件仍然作爲結果返回,直到一切都重新開始,即作者,讀者和搜索是重新實例化。此外,它不工作在這樣的查詢理清刪除的文檔:

if (_enIndexReader.IsDeleted(documentId)) continue; 

,已刪除還是回到falseIndexReader.IsDeleted(Document)的文件。

如何以最小的計算成本反映IndexWriterIndexSearcher/IndexReader中所做的更改?在刪除之後重塑所有內容不是一種選擇。

我使用Lucene.NET v4.0.30319。

回答

1

明白了。 IndexReader.Reopen()返回調用該方法的讀取器的重新打開的實例,同時保持原樣。因此,代碼需要像這樣修改:

_enIndexWriter.DeleteDocuments(query); 
_enIndexWriter.Commit(); 
_enIndexReader = _enIndexReader.Reopen(); 
_enIndexSearcher = new IndexSearcher(_enIndexReader); 
相關問題