【问题标题】:Lucene blocks while searching and indexing at the same timeLucene 在同时搜索和索引时阻塞
【发布时间】:2015-06-24 08:04:56
【问题描述】:

我有一个在“近实时”模式下使用 Lucene(最新版本,撰写本文时为 5.2.1)的 Java 应用程序;它有一个网络连接来接收索引文档的请求,另一个连接来接收搜索请求。

我正在测试一个包含相当大的文档(几兆字节的纯文本)的语料库,以及使用不同分析器的每个字段的多个版本。其中一个是带有 Beider-Morse 滤波器的语音分析器,某些文档的索引可能需要相当长的时间(在某些情况下超过一分钟)。大部分时间都花在调用 IndexWriter.addDocument(doc);

我的问题是,在对文档进行索引时,搜索会被阻止,并且在索引操作完成之前不会对其进行处理。阻止搜索超过几秒钟是不可接受的。

在每次搜索之前,我都会执行以下操作:

DirectoryReader newReader = DirectoryReader.openIfChanged(reader, writer, false);

if (newReader != null)
{
    reader = newReader;
    searcher = new IndexSearcher(reader);
}

我想这就是导致问题的原因。但是,这是我进行搜索时获取最新更改的唯一方法。我希望总体上保持这种行为,但如果搜索会被阻止,我不介意使用稍微旧版本的索引。

有没有办法解决这个问题?

【问题讨论】:

    标签: java multithreading performance lucene


    【解决方案1】:

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

    然后您应该请求索引阅读器(而不是目录)并根据需要刷新它们。或者简单地使用SearcherManager,它不仅会为您刷新搜索器,还会维护读者池并管理对它们的引用,以避免在索引内容未更改时重新打开。

    查看更多here

    【讨论】:

    • 我不确定这与我的问题有多大关系。我已经有一个始终打开的 IndexWriter。问题是当我尝试更新近实时的 IndexSearcher 时;如果 IndexWriter 正在写入,它会等到索引操作完成,并且我的一些文档需要很长时间才能索引(超过一分钟)。我担心 SearcherManager 根本无济于事,但感谢您的链接;我不知道。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2012-10-22
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多