Lucene最佳实践和线程安全

20
我正在使用Lucene对文档进行索引并执行搜索,之后立即删除它们。这可以视为一种相当原子的操作,包括以下步骤:

索引(writer)--> 搜索(searcher)-->按分数获取文档(reader)-->删除文档(reader)

可以通过多个并发线程在同一个索引上执行此操作(使用FSDirectory)。
重要提示:每个线程处理一组单独的文档,因此一个线程不会触及另一个线程的文档。
为此,我有几个问题:
1)我应该使用IndexWriterIndexReaderIndexSearcher的单个实例(用于所有线程)吗?(它们应该是线程安全的)
2)IndexWriter是否可以在IndexReader删除文档时操纵索引?我需要关闭其中一个以让另一个进行操作吗?也就是说,一个线程可以在另一个线程从中删除文档时写入索引吗?(正如我之前提到的,我可以保证它们处理不同的数据集)
3)您可能有的其他最佳实践和建议将不胜感激。
非常感谢!
1个回答

35

IndexWriterIndexReaderIndexSearcher 根据 api javadoc 是线程安全的:

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

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

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

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

只能打开一个 IndexWriter (并且它将创建写入锁定,以防止其他人在相同的索引上被打开)。您可以使用 IndexReaderIndexWriter 持有此锁定时删除文档。 IndexReader 将始终看到它打开时的索引,只有在 writer 提交它们并重新打开 reader 后,writer 所做的更改才可见。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接