我正在开发一个WPF应用程序,它使用Lucene.Net来索引第三方进程生成的文件中的数据。它的容量很小,新文件每分钟创建的次数不会超过一次。
我的应用程序使用在启动时创建的单例IndexWriter
实例。同样,IndexSearcher
也会在启动时创建,但只要IndexWriter.Commit()
出现就会重新创建,以确保新添加的文档会出现在搜索结果中。
无论如何,一些用户需要运行应用程序的两个实例,但问题是在第二个实例中搜索时不会显示新添加的文档。我想这是因为第一个实例正在进行提交,并且需要有一种方法来告诉第二个实例重新创建其IndexSearcher。
一种方法是使用文件create / update和FileSystemWatcher来发出信号,但首先想知道Lucene.Net中是否有任何我可以使用的东西?
答案 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。当第一个实例关闭时删除锁定文件时,它可能会执行此操作。
“更好”的方法是启动“服务”(只是后台进程,可能在系统托盘中)。 应用程序的所有实例将查询此服务。如果应用程序已启动且未检测到服务,请将其旋转。