Lucene.Net是否管理多个访问同一索引的线程,一个索引而另一个正在搜索?

Cor*_*ger 15 asp.net lucene concurrency lucene.net

当使用Lucene.Net和ASP.NET时,我可以想象一个Web请求可以触发对索引的更新,而另一个Web请求正在执行搜索.Lucene.Net是否内置了管理并发访问的能力,或者我是否必须对其进行管理,以避免"被其他进程使用"错误?

编辑:阅读文档和实验后,我认为这是我所学到的:有两个问题,线程安全和并发.多线程是"安全的",因为你不能对索引做任何坏事.但是,以一个锁定索引的对象为代价是安全的.第二个对象将出现并抛出异常.因此,您不能打开搜索并期望另一个线程中的编写者能够更新索引.如果线程正在忙于更新索引,那么尝试创建搜索器将失败.

此外,搜索者会看到索引在打开时的状态,因此如果您保留它们并更新索引,他们将看不到更新.

我希望我的搜索者能够看到最新的更新.

我的设计,到目前为止似乎工作,是我的作家和搜索者共享锁,以便他们不会失败 - 他们只是等待 - 直到当前的写或搜索完成.

Jud*_*ngo 22

根据这个页面,

索引和搜索不仅是线程安全的,而且是过程安全的.这意味着:

  • 多个索引搜索者可以同时读取lucene索引文件.
  • 索引编写者或读者可以在搜索过程中编辑lucene索引文件
  • 多个索引编写器或读者可以尝试同时编辑lucene索引文件(关闭索引编写器/读取器以便释放文件锁定非常重要).但是,查询解析器不是线程安全的,因此使用索引的每个线程都应该有自己的查询解析器.

但是,索引编写器是线程安全的,因此您可以在人们搜索索引时更新索引.但是,您必须确保具有开放索引搜索器的线程关闭它们并打开新的线程以获取新更新的数据.

  • 当然.但是,Lucene.NET实现几乎完全匹配Java Lucene实现.我怀疑它们实际上是在运行Java-to-C#转换器,修补它并将其作为Lucene.NET发布. (2认同)

Mat*_*ght 2

您不会遇到管理对索引的并发写入的问题。我使用 SOLR 有了一条更简单的路径,它为我抽象了大部分差异,因为它作为服务器运行。