Lucene.NET并行索引。我需要一个自定义解决方案有人可以帮忙吗?

时间:2009-07-13 11:42:42

标签: c# indexing lucene.net parallel-processing

我正在使用Lucene .NET

我有2个线程,每个线程都在对一些不同的内容进行索引(使用不同的算法,尽管他们可能会尝试索引同一个文档)。它们都写入相同的索引(使用单个IndexWriter实例)。

另外,我有一个Web应用程序,偶尔也需要写入索引。 (显然不能使用相同的索引编写器实例)

我的问题是,当2个线程正在运行索引操作时,Web应用程序无法写入索引,它们总是!!

如何更有效地管理此问题?

由于

2 个答案:

答案 0 :(得分:2)

我不太熟悉Lucene.NET如何支持线程,但根据您的描述,您可能希望创建一个其他线程发布工作的“工作队列” - 并使用单个线程来获取工作从队列中使用IndexWriter将其添加到索引中。这样就没有机会将单个线程的更改添加到索引中了。

我怀疑Lucene必须在其全文索引上使用内部锁,因此有多个线程写入索引可能不是扩展代码的有效方法。

最后,让多个线程写入单个可变对象通常是一种在代码库中引入细微且难以修复的并发问题的方法。我一般都试图避免让多个作者 - 多个读者,另一方面可能非常有用。

答案 1 :(得分:1)

如果您不想使用LBushkin的工作队列概念,另一种方法是在后台线程使用的Web应用程序中使用相同的IndexWriter实例。您还没有解释2个索引线程的位置 - 如果它们与Web应用程序位于相同的进程/ appdomain中,则使用相同的实例应该是可行的。如果没有,那么你必须使用LBushkin提到的工作队列的等价物,或者它的改编版本,如下所示:向索引过程添加第三个线程,其工作是监听来自Web应用程序的索引请求。你可以用例如为此命名管道(如果您使用的是.NET 3.5,则特别容易)。 Web应用程序将索引请求发送到第三个线程,该第三个线程使用与其他现有线程相同的IndexWriter来更新索引。

这与LBushkin(第三个线程是工作队列消费者)的想法基本相同,但可能涉及较少的开发工作,因为您可以减少额外的编码。

更新:命名管道可以在不同计算机上的进程之间使用。您只需要了解某些网络拓扑中可能出现的防火墙问题。