使用Lucene.Net的多个应用程序实例

时间:2015-12-10 15:19:27

标签: lucene lucene.net

我正在开发一个WPF应用程序,它使用Lucene.Net来索引第三方进程生成的文件中的数据。它的容量很小,新文件每分钟创建的次数不会超过一次。

我的应用程序使用在启动时创建的单例IndexWriter实例。同样,IndexSearcher也会在启动时创建,但只要IndexWriter.Commit()出现就会重新创建,以确保新添加的文档会出现在搜索结果中。

无论如何,一些用户需要运行应用程序的两个实例,但问题是在第二个实例中搜索时不会显示新添加的文档。我想这是因为第一个实例正在进行提交,并且需要有一种方法来告诉第二个实例重新创建其IndexSearcher。

一种方法是使用文件create / update和FileSystemWatcher来发出信号,但首先想知道Lucene.Net中是否有任何我可以使用的东西?

2 个答案:

答案 0 :(得分:2)

我能想到的唯一可能对你有帮助的是IndexReader.Reopen()。如果自最初打开阅读器以来索引已更改,则会刷新IndexReader,但。在索引尚未更新的情况下,它应该导致最小的磁盘访问,并且在它有的情况下,它会尝试仅加载已更改或添加的段。

有关API的一点注意事项:Reopen会返回IndexReader。在索引没有改变的情况下,它返回相同的实例;否则它会返回一个新的。原始索引阅读器未被处理,因此您需要手动执行:

IndexReader reader = /* ... */;
IndexReader newReader = reader.Reopen();

if(newReader != reader)
{
    // Only close the old reader if we got a new one
    reader.Dispose();
}

reader = newReader;

我现在无法找到.NET文档,但是here are the Java docs用于解释API的Lucene 3.0.3。

答案 1 :(得分:1)

如果两个实例都在同一目录中打开了自己的IndexWriter,那么您将陷入痛苦和间歇性不良行为的世界。

IW期望并且需要对索引目录进行独占控制。这就是锁定文件的原因。

如果第二个实例可以检测到存在现有实例,那么您可以只在该文件夹上打开IndexReader / Searcher,并在目录更改时重新打开。

但是如果第一个实例关闭会发生什么?索引将不再更新。所以第二个实例需要重新初始化,这次是IW。当第一个实例关闭时删除锁定文件时,它可能会执行此操作。

“更好”的方法是启动“服务”(只是后台进程,可能在系统托盘中)。 应用程序的所有实例将查询此服务。如果应用程序已启动且未检测到服务,请将其旋转。