我有一个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

09-30 15:11
查看更多