Lucene 近实时搜索

Posted

技术标签:

【中文标题】Lucene 近实时搜索【英文标题】:Lucene Near Realtime Search 【发布时间】:2013-10-17 09:56:00 【问题描述】:

我想提高我的搜索系统的速度,通过使用“近乎实时搜索”等一些功能,加快索引的打开速度。

谁能告诉我使用以下一段代码有什么区别和优势:

IndexReader newIndexReader = IndexReader.openIfChanged(oldReader);

IndexWriter writer; // create an IndexWriter here
...
IndexReader reader = writer.getReader();

请注意,在第一种情况下,我不需要 indexWriter 与 IndexReader 处于同一进程中。

【问题讨论】:

【参考方案1】:

首先,writer.getReader() 仅在 3.6 版本中可用,但在所有 v4(4.0、4.1、...)版本中均不存在。因此,如果您关心可维护性,则不应使用它。

现在,回答您的问题。 writer.getReader() 刷新所有挂起的写入并无条件地打开一个新的阅读器(此外还有一些其他限制 - 参见方法 javadoc)。 IndexReader.openIfChanged(oldReader) 仅在进行任何更改时打开新阅读器,否则返回旧阅读器。

在我看来,从 writer 打开阅读器在概念上也是错误的(在 Lucene 中曾经有其他情况存在此问题,例如过去可以使用阅读器删除文​​档)。

如果您在两者之间进行选择,我认为使用哪种方法是毫无疑问的。

【讨论】:

您还了解这两种方法的性能吗? 如果底层索引没有改变,IndexReader.openIfChanged(oldReader) 应该更快,因为它是空操作。如果索引已更改,我不确定,需要进行更多研究。

以上是关于Lucene 近实时搜索的主要内容,如果未能解决你的问题,请参考以下文章

es基础用法

ES: 架构及原理

一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

ES: 架构及原理

Elasticsearch通关

Lucene -- 准实时搜索Near Real Time