卢森良好规范和螺纹安全

2022-09-02 12:27:26

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

索引(编写器) -->搜索(搜索器) -->按分数(读者)获取文档 -->删除文档(读者)

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

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

为此,我有几个问题:

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

2)一个可以操作索引,同时删除文档吗?我需要关闭一个才能让另一个做它的事情吗?这意味着,一个线程可以写入索引,而另一个线程可以从中删除索引(正如我之前提到的,我可以保证它们处理单独的数据集)IndexWriterIndexReader

3)您可能拥有的任何其他良好做法和建议将不胜感激。

多谢!


答案 1

IndexWriter并且根据 api javadoc 是线程安全的:IndexReaderIndexSearcher

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

注意:IndexReader 实例是完全线程安全的,这意味着多个线程可以并发调用其任何方法。

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

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

只能打开一个(它将创建一个写锁定,以防止在同一索引上打开其他写锁定)。您可以使用 在按住此锁的同时删除文档。 将始终看到打开索引时的状态,编写器所做的更改只有在编写器提交它们并重新打开读取器后才可见。IndexWriterIndexReaderIndexWriterIndexReader

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


答案 2