2011-05-12 81 views
2

我正在接管一個項目,所以我仍然在學習這一點。該項目使用Lucence.NET。我也不知道這個功能是否正確。無論如何,我實例:Lucene.NET - 無法使用IndexWriter刪除文檔

var writer = new IndexWriter(directory, analyzer, false); 

對於具體的文件,我打電話:

writer.DeleteDocuments(new Term(...)); 

最後,我打電話通常writer.Optimize(),writer.Commit() ,和writer.Close()。

Term對象中的字段是Guid,轉換爲字符串(.ToString(「D」)),並存儲在文檔中,使用Field.Store.YES和Field.Index.NO。

但是,通過這些設置,我似乎無法刪除這些文檔。目標是刪除,然後添加更新的版本,以便獲取同一文檔的重複內容。如果需要,我可以提供更多的代碼/解釋。有任何想法嗎?謝謝。

回答

7

該字段必須編入索引。如果一個字段沒有編入索引,它的條款將不會在枚舉中顯示。

+0

我做了一些更多的研究後,我意識到並測試了這個。我爲列編制索引,重建它,現在文檔正確地被刪除。謝謝。 – 2011-05-12 17:34:30

+0

我看到了同樣的問題,但我不明白你的意思是「該字段必須編入索引」。你能澄清一下嗎? – 2013-04-05 18:30:23

4

我不認爲你如何處理作者有什麼問題。

聽起來好像您傳遞給DeleteDocuments的術語沒有返回任何文檔。你是否嘗試過使用相同的術語來查詢它是否返回任何結果?

另外,如果你的目標是重新創建簡單的文檔,你可以調用UpdateDocument:

//  Updates a document by first deleting the document(s) containing term and 
//  then adding the new document. The delete and then add are atomic as seen 
//  by a reader on the same index (flush may happen only after the add). NOTE: 
//  if this method hits an OutOfMemoryError you should immediately close the 
//  writer. See above for details. 

您可能還需要檢查出SimpleLucene(http://simplelucene.codeplex.com) - 它使做基本的Lucene任務有點容易。

[更新] 不知道我錯過了它,但@Shashikant Kore是正確的,你需要確保該字段是索引,否則你的術語查詢將不會返回任何東西。

+0

我不能讚揚你們兩個,我可以嗎? – 2011-05-12 17:34:59