2013-10-04 103 views
1

A ScoreDoc[]數組包含來自搜索的所有文檔ID。我想使用這些文檔ID來更新單個文檔。在這個特定的實例中,我不能唯一地標識我希望更新的行,因爲給定的術語將導致匹配多個文檔。是否可以使用其文檔ID更新Lucene文檔?

想象一個1查詢:一,2:B和下列文件返回

 1 2 3 4 5 6 
doc 1: a b c d e f 
doc 2: a b g h i j 
doc 3: a b k l m n 

我基本上是做一個更新的字段3和4,但要離開5和6完好無損。

目前我可以抓住這些行,進行我想要的更新,但是我找不到在索引中更新它們的方法。

indexWriter.updateDocuments(...)indexwriter.DeleteDocuments(...)將導致文檔1,2,3被刪除。

由於我有documentId,我認爲有一種方法可以讓我用它更新索引。

回答

5

Lucene不允許更新文檔中的字段。這完全是一個刪除/添加機制。

文檔的docId可以在優化,合併等過程中進行更改,因此依賴該文檔始終是相同的並不是您想要執行的操作。您應該將自己的域放入文檔中,這些文檔不會隨時間而改變,而是使用它。

+1

爲了澄清,IndexWriter.UpdateDocument(期限,文件)只刪除具有長期_all_文件,然後將所提供的文檔。對於特定的IndexReader實例,文檔標識符是靜態的和不變的(因爲在打開/重新打開閱讀器之前不會使用合併)。只要您還跟蹤與其關聯的讀取器實例,就可以跟蹤文檔標識符。 – sisve

1

有一種方法可以通過docid刪除:IndexWriter.tryDeleteDocument。刪除文檔後,可以添加新文檔,正如其他人所述,Lucene是如何執行更新的。

以上鍊接的文檔提供了有關爲什麼它被稱爲一些有趣的信息嘗試 DeleteDocument

相關問題