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 近实时搜索的主要内容,如果未能解决你的问题,请参考以下文章
一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询