2012-01-16 69 views
17

我使用Lucene來索引文檔並執行搜索後,我立即將其刪除。 這一切都可以被認爲是包括以下步驟有點原子動作:Lucene的良好做法和線程安全

指數(作家)- >搜索(搜索)- >獲得通過的分數文檔 (讀者)- >刪除文檔(讀取器)

這個動作可以通過在相同的索引多個併發線程(使用FSDirectory)來執行。

重要提示:每個線程處理一組獨立的文件,使一個線程不會去碰另一個線程的文件

爲目的,我有幾個問題:

1)我應該使用一個單一的實例(所有線程)的IndexWriterIndexReaderIndexSearcher? (它們應該是線程安全的)

2)可以通過一個IndexWriter操作索引,而IndexReader刪除文件?我需要關閉另一個來做它的事嗎? 的意思是,一個線程可以寫入索引而另一個線程從中刪除(正如我前面提到的,我可以保證他們處理單獨的數據集)

3)您可能有的任何其他良好做法和建議最受讚賞。

非常感謝!

回答

29

IndexWriterIndexReaderIndexSearcher線程安全的根據API的javadoc:

注:IndexSearcher的情況下是完全線程安全的,這意味着 多個線程可以調用它的任何方法,同時

注意:IndexReader實例是完全線程安全的,也就是說多個線程可以同時調用其任何方法。

注:的IndexWriter情況下是完全線程安全的,這意味着 多個線程可以調用它的任何方法,同時

多個只讀IndexReader s時,可以打開,但它更好地共享一個(出於性能原因)。

只有一個IndexWriter可以打開(這將創建一個寫鎖,防止他人在相同指數被打開)。您可以使用IndexReader刪除文件,而IndexWriter持有該鎖。IndexReader將始終看到索引在打開時的狀態,只有在作者提交索引後重新打開閱讀器才能看到作者完成的更改。

任何數量的IndexSearcher s都可以打開,但最好再分享一個。即使索引被修改,它們也可以使用。與IndexReader的作用相同(在搜索者重新打開之前,更改不可見)。

+0

感謝您的迅速和書面答覆! – levtatarov 2012-01-16 11:25:14