C# Lucene.net&;NHibernate搜索并发问题

C# Lucene.net&;NHibernate搜索并发问题,c#,nhibernate,concurrency,lucene.net,nhibernate-search,C#,Nhibernate,Concurrency,Lucene.net,Nhibernate Search,我有一个web应用程序,它使用Lucene.Net和NHibernate.Search作为全文搜索引擎。搜索设置为每当数据库中发生更改时,都会传播到Lucene索引 web应用程序正在使用4个辅助进程运行。首先,这是一个问题吗?我注意到Lucene索引与数据库不是100%同步的。Lucene索引中未显示对数据库的某些更改。但是,当我手动尝试对数据重新编制索引时,这种方法效果很好 在多进程环境中使用Lucene.Net是否会导致并发问题?这听起来像是打开的IndexWriter在索引目录上保持锁定

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

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


在多进程环境中使用Lucene.Net是否会导致并发问题?

这听起来像是打开的IndexWriter在索引目录上保持锁定的问题。一个辅助进程将锁定其他进程的索引

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


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

您还应该记住,IndexReader仅在索引打开时对其有效——如果索引是在IndexReader打开后更新的,您将看不到这些新文档。@MarkLeightonFisher问题是由于
锁定超时
-首先,我关闭了NHibernate记录器,因此无法检测到它。问题是,当触发此超时时,该项不会保存。“我还得找出所有这些暂停的确切原因。你和卡尔的关系好吗?”科维尔达夫-不,不幸的是还没有!当使用相同的Lucene索引时,进程将随机崩溃,或者无限期锁定。为了避免这种情况,我添加了一个backround进程,该进程监视索引中是否存在过多的锁,并自动删除它们。我并不为这个解决方案感到自豪,但它可以工作,而且没有时间重新工作系统以使用SOLR,因为它似乎应该是最好的方法,或者将搜索分离到一个外部进程。从那时起,我开始使用Lucene上的文档数据库进行搜索,因为搜索功能被提取到一个外部进程。从这一点上,我了解到Lucene每个索引只支持一个编写器。