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