【问题标题】:Lucene.net & NHibernate search concurrency issuesLucene.net 和 NHibernate 搜索并发问题
【发布时间】:2012-11-03 22:36:38
【问题描述】:

我有一个使用 Lucene.Net 和 NHibernate.Search 作为全文搜索引擎的 Web 应用程序。 NHibernate.Search 的设置使得每当数据库中发生更改时,它都会传播到 Lucene 索引。

Web 应用程序正在使用 4 个工作进程运行。首先,这是一个问题吗?我注意到 Lucene 索引不是 100% 与数据库同步。对数据库的某些更改未出现在 Lucene 索引中。但是,当我手动尝试重新索引数据时,效果很好。

在多进程环境中使用 Lucene.Net 是否有任何并发​​影响?

【问题讨论】:

  • 您还应该记住,IndexReader 仅适用于打开时存在的索引 - 如果在打开 IndexReader 后更新了索引,您将看不到那些新文档。
  • @MarkLeightonFisher 问题是由于LockObtainTimeouts - 首先我关闭了 NHibernate 记录器,因此无法检测到它。问题是当触发这样的超时时,该项目不会被保存。我仍然需要找到所有这些超时的确切原因。
  • 你对这个 Karl 有什么好运吗?
  • @coalvilledave - 不,很遗憾还没有!随机地,当使用相同的 Lucene 索引时,进程会崩溃,或者无限期地锁定。为了避免这种情况,我添加了一个后台进程,它监视索引中是否存在任何过度就位的锁,并自动删除它们。我对这个解决方案并不感到自豪,但它可以工作并且没有时间重新设计系统以使用 SOLR,因为它似乎应该是最好的方法,或者将搜索拆分到外部进程。

标签: c# nhibernate concurrency lucene.net nhibernate-search


【解决方案1】:

这听起来像是一个打开的 IndexWriter 锁定索引目录的问题。一个工作进程会锁定其他进程的索引。

只要每个索引只有一个写入器,Lucene.Net 就可以在多进程环境中使用。不同的目录实现以不同的方式强制执行此操作,通常涉及名为 write.lock 的文件。

一个常见的解决方案是有一个单独的搜索过程来处理索引和搜索。

【讨论】:

  • 从那时起,我开始使用 Lucene 上的文档数据库进行搜索,因为搜索功能被提取到外部进程。从中,我艰难地了解到 Lucene 每个索引只支持一个写入器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2011-08-31
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多