我有一个Java应用程序在“近实时”模式下使用Lucene(最新版本,撰写本文时为5.2.1)。它具有一个网络连接以接收对索引文档的请求,并具有另一个用于搜索请求的连接。
我正在测试相当大的文档(几兆字节的纯文本)和每个字段具有不同分析器的多个版本的测试。其中之一是带有Beider-Morse过滤器的语音分析器,对某些文档的索引可能要花费大量的时间(在某些情况下需要一分钟)。大部分时间都用在对IndexWriter.addDocument(doc)的调用中;
我的问题是,在对文档建立索引时,搜索将被阻止,并且直到索引操作完成后才进行处理。阻止搜索超过几秒钟是不可接受的。
在每次搜索之前,我需要执行以下操作:
DirectoryReader newReader = DirectoryReader.openIfChanged(reader, writer, false);
if (newReader != null)
{
reader = newReader;
searcher = new IndexSearcher(reader);
}
我猜这是导致问题的原因。但是,这是我进行搜索时获取最新更改的唯一方法。我希望总体上保持这种行为,但是如果搜索被阻止,我将不介意使用索引的旧版本。
有没有什么办法解决这一问题?
最佳答案
在其他选项中,请考虑始终打开IndexWriter
并根据需要对其执行“提交”。
然后,您应该请求它的索引读取器(而不是目录),并根据需要刷新它们。或者只是使用SearcherManager
不仅可以为您刷新搜索者,而且还可以维护阅读器池并管理对它们的引用,从而避免在索引内容未更改的情况下重新打开。
查看更多here。