lucene良好的做法和线程安全

lev*_*rov 17 java lucene multithreading thread-safety

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

index(writer)- > search(searcher)- >按分数获取文档(读者)- >删除文档(读者)

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

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

为此我有几个问题:

1)我应该使用单个实例(对于所有线程)IndexWriter,IndexReaderIndexSearcher?(它们应该是线程安全的)

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

3)您将获得的任何其他良好做法和建议将非常受欢迎.

非常感谢!

mil*_*lan 32

IndexWriter,IndexReader并且IndexSearcher 根据API的javadoc线程安全的:

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

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

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

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

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

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