lucene良好的做法和线程安全

时间:2012-01-16 10:09:32

标签: java multithreading lucene thread-safety

我正在使用lucene索引文档并执行搜索,之后我立即删除它们。 所有这些都可以被视为一种有点原子动作,包括以下步骤:

  

索引(作家) - > 搜索(搜索者) - > 按分数获取文档   (读者) - > 删除文档(读者)

此操作可以由同一索引上的多个并发线程执行(使用FSDirectory)。

重要说明:每个线程处理一组单独的文档,因此一个线程不会触及另一个线程的文档

出于这个目的,我有几个问题:

1)我应该使用IndexWriterIndexReaderIndexSearcher的单个实例(适用于所有线程)吗? (它们应该是线程安全的)

2)IndexWriter可以在IndexReader删除文档的同时操纵索引吗?我是否需要关闭另一个才能做到这一点? 意思是,一个线程可以写入索引而另一个线程从中删除(如前所述,我可以保证它们处理单独的数据集)

3)我们非常感谢您可能拥有的任何其他良好做法和建议。

非常感谢!

1 个答案:

答案 0 :(得分:32)

根据api javadoc,

IndexWriterIndexReaderIndexSearcher 是线程安全的:

  

注意: IndexSearcher 实例完全是线程安全的,这意味着   多个线程可以同时调用它的任何方法

     

注意: IndexReader 实例完全是线程安全的,意味着多个   线程可以同时调用它的任何方法。

     

注意: IndexWriter 实例完全是线程安全的,这意味着   多个线程可以同时调用它的任何方法

可以打开多个只读IndexReader,但最好共享一个(出于性能原因)。

只能打开一个IndexWriter(它会创建一个写锁定,以防止其他人在同一个索引上打开)。 IndexReader拥有此锁定时,您可以使用IndexWriter删除文档。 IndexReader将始终看到索引在打开时的状态,只有在作者提交读者重新打开后,才能看到作者所做的更改。

可以打开任意数量的IndexSearcher,但同样最好共享一个IndexReader。即使在修改索引时也可以使用它们。与{{1}}的工作方式相同(在重新打开搜索器之前,更改不可见)。

相关问题