2012-01-16 71 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