lucene良好的实践和线程安全
我正在使用lucene索引文档并执行搜索,之后我立即删除它们。 所有这些都可以被视为一个有点primefaces的动作,包括以下步骤:
index(writer) – > search(searcher) – >按分数获取文档(读者) – >删除文档(读者)
此操作可以由同一索引上的多个并发线程执行(使用FSDirectory
)。
重要说明:每个线程处理一组单独的文档,因此一个线程不会触及另一个线程的文档
为此我有几个问题:
1)我应该使用IndexWriter
, IndexReader
和IndexSearcher
的单个实例(对于所有线程)吗? (它们应该是线程安全的)
2) IndexWriter
可以操作索引,而IndexReader
删除文档吗? 我是否需要关闭另一个才能做到这一点? 意思是,一个线程可以写入索引而另一个线程从中删除(如前所述,我可以保证它们处理单独的数据集)
3)您将获得的任何其他良好做法和建议将非常受欢迎。
非常感谢!
根据api javadoc, IndexWriter
, IndexReader
和IndexSearcher
是线程安全的:
注意: IndexSearcher实例完全是线程安全的,这意味着多个线程可以同时调用其任何方法
注意: IndexReader实例是完全线程安全的,这意味着多个线程可以同时调用其任何方法。
注意: IndexWriter实例完全是线程安全的,这意味着多个线程可以同时调用其任何方法
可以打开多个只读IndexReader
,但最好共享一个(出于性能原因)。
只能打开一个IndexWriter
(它将创建一个写锁定以防止其他索引在同一个索引上打开)。 当IndexWriter
持有此锁时,您可以使用IndexReader
删除文档。 IndexReader
将始终看到索引在打开时的状态,只有在作者提交读者重新打开后,才能看到编写者所做的更改。
可以打开任意数量的IndexSearcher
,但同样最好共享一个。 即使在修改索引时也可以使用它们。 与IndexReader
工作方式相同(在重新打开搜索器之前,更改不可见)。