Lucene在搜索和索引的同时阻止

时间:2015-06-24 08:04:57

标签: java multithreading performance lucene

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

我想这就是造成这个问题的原因。但是,在进行搜索时,这是获取最新更改的唯一方法。我想一般地保持这种行为,但如果搜索会阻止,我不介意使用稍微旧版本的索引。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

在其他选项中,考虑始终打开IndexWriter并根据需要对其执行“提交”。

然后你应该向它索引索引(而不是目录)并根据需要刷新它们。或者只是使用SearcherManager,它不仅会为您刷新搜索者,还会维护一个读者池并管理对它们的引用,以避免在索引内容没有更改时重新打开。

查看更多here