当前位置: 首页 > 面试题库 >

lucene良好实践和线程安全

刘棋
2023-03-14
问题内容

我正在使用lucene为文档建立索引并执行搜索,之后我立即将其删除。所有这一切都可以看作是有点原子的动作,包括以下步骤:

索引(作者) - >搜索(搜索者) - >按得分获取文档(阅读器) - >删除文档(阅读器)

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

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

为此,我有几个问题:

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

2)可以在IndexWriter操纵索引的同时IndexReader删除文件吗?我需要关闭另一个才能执行其操作吗?意思是,一个线程可以写一个索引,而另一个线程可以删除它吗(正如我前面提到的,我可以保证它们处理单独的数据集)

3)您可能会想到的其他任何好的做法和建议,将不胜感激。

非常感谢!


问题答案:

IndexWriterIndexReader并且根据api javadoc IndexSearcher 线程安全的:

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

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

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

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

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

IndexSearcher可以打开任意数量的,但最好还是共享一个。即使在修改索引时也可以使用它们。的工作方式与相同IndexReader(更改仅在重新打开搜索器后才可见)。



 类似资料:
  • 我的大部分编程经验都是用C++编写的。我正在学习Javafx中的许多优秀特性,但到目前为止,我最大的障碍是在用Javafx编写应用程序时是否使用了良好的编程实践。首先,我被教导要在C++中保持“main函数”尽可能干净,所以它主要包含我自己的类对象及其方法。在外汇工作时,这是一般的好做法吗?即在包含start方法的主类之外创建一些类,然后将这些类的对象添加到start方法中?这里有一个例子: 这个

  • 我想在Spring中正确地处理我的异常,所以我有一个关于exceptionHandler语法的问题:如果异常处理程序捕获了特定的异常,那么在控制器中抛出特定的异常可以吗?

  • 问题内容: 我对处理Java中的异常有一些疑问。我读了一些,并得到了一些相互矛盾的指导方针。 异常处理的最佳实践 让我们看一下提到的文章: 它指出, 如果“客户端代码无法执行任何操作”, 通常应该避免使用检查的异常。但这到底是什么意思?在GUI中显示错误消息是否是冒充受检查的异常的充分原因?但这将迫使GUI程序员记住记住RuntimeException及其后代以显示潜在的错误信息。 本文提出的第二

  • 我在android的世界是相当新的,我不知道如何正确修改操作栏。 在我的例子中,主活动有一个,我在其中使用导航抽屉在片段之间切换。 我已经看到有几种方法可以改变动作栏参数,但是我不太确定哪种是最好的。到目前为止,我正在使用以下方法来改变动作栏(和片段): 正如您在代码中看到的,我更改了操作栏、标题和图像的颜色。这是改变内容的正确方式还是我强迫机器? 我无法自动更改状态栏的颜色。我读过好几篇帖子,但

  • 我有一个带有一些图标的菜单项的操作栏。我想要的是在两个可绘制对象之间切换。 这是我迄今为止所做的: 这并不太好,因为它改变了一次图标,再也不会回来了。