2011-10-07 150 views
4

我需要從我的Lucene索引中刪除文檔,然後能夠稍後重新添加它們。看來,如果我將文檔標記爲已刪除,然後嘗試再次添加它,文檔仍然會被刪除。如何「取消刪除」文檔?是否有可能在Lucene.net索引中取消刪除文檔?

這是怎麼了標記的文件爲「已刪除」:

Term = new Tearm("id", Id.Value); 
    IndexSearcher.reader.DeleteDocuments(term); 
    IndexSearcher.reader.Close(); 

所以,如果我想..我會怎麼做,再次「激活」這個文件呢?

謝謝!

+0

看來你使用的是一個非常舊的版本的Lucene.Net(現在,人們使用IndexWriter的Delete方法)你使用哪個版本? –

+0

我使用的是2.0.0.4版本。我沒有意識到IndexWriter上有一個刪除方法。該刪除是否真的刪除了文檔,還是隻是將其刪除? – Nick

+0

A)否,2.0.0.4中IndexWriter上沒有Delete方法。如果我記得正確的話,它是在2.3.1中介紹的。 B)'或者它只是標記爲刪除'這是所有(AFAIK)數據庫,搜索引擎的工作方式。我認爲,在升級到2.9.2或2.9.4後,重新提出您的問題會更好一些。 –

回答

1

我對Lucene.Net並不熟悉,但Java版本有IndexReader.undeleteAll()方法。

Lucene的刪除是軟刪除。這意味着,當文檔被刪除時,它們被標記爲刪除。只有在優化索引時,刪除的索引文件纔會被清除。文檔列表保存在索引目錄中的.del文件中。 undeleteAll()方法清除文件的內容以使這些文件再次生效。 (不要嘗試手動刪除此文件,因爲此文件的引用保留在索引段文件中。)

您無法取消刪除文檔的子集。您必須取消刪除所有文件。您可以通過獲取所有已刪除文檔的列表來模擬所需的功能,調用undeleteAll(),然後再次刪除除希望保留的文檔之外的文檔。

+0

是否可以查詢刪除文檔的索引? – Nick

+0

您可以迭代索引中的所有文檔ID並檢查它是否被刪除。這裏是IndexReader的相關API。 http://lucene.apache.org/java/3_0_1/api/core/org/apache/lucene/index/IndexReader.html#isDeleted(int) –

1

我認爲你最好不要刪除文檔,而是評價添加一個字段,將它們標記爲已刪除並將該字段過濾出您的查詢。除非有人要求形式刪除文件,那麼你可以很容易地顯示他們。

相關問題