我有一个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);
}
我想这就是造成这个问题的原因。但是,在进行搜索时,这是获取最新更改的唯一方法。我想一般地保持这种行为,但如果搜索会阻止,我不介意使用稍微旧版本的索引。
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
在其他选项中,考虑始终打开IndexWriter
并根据需要对其执行“提交”。
然后你应该向它索引索引(而不是目录)并根据需要刷新它们。或者只是使用SearcherManager
,它不仅会为您刷新搜索者,还会维护一个读者池并管理对它们的引用,以避免在索引内容没有更改时重新打开。
查看更多here。