Lucene -- 准实时搜索Near Real Time
Posted Nireus_LOVE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene -- 准实时搜索Near Real Time相关的知识,希望对你有一定的参考价值。
NRT:Near Real Time , Lucene 为了支持实时搜索,在 2.9 版本就已经设计出来。想更多了解可以看看 http://wiki.apache.org/lucene-java/NearRealtimeSearch 它的原理记录在 LUCENE-1313 和 LUCENE-1516。介绍下代码实现的过程:
在 Index Writer 内部维护了一个 Ram Directory,在内存够用前,flush 和 merge 操作只是把数据更新到 Ram Directory,这个时候读写最新的索引都在内存中。只有 Index Writer 在 optimize 和 commit 操作会把 Ram Directory 上的数据完全同步到文件
当内存索引达到一个阀值时,程序主动执行 commit 操作时,内存索引中的数据异步写入硬盘。当数据已经全部写入硬盘之后,程序会对硬盘索引重读,形成新的 IndexReader,在新的硬盘 IndexReader 替换旧的硬盘 IndexReader 时,形成新的 IndexReader。后面再来的读请求交给新的 IndexReader 处理。
补充一下,在 1 过程中,变动的数据不是简单更新到 Old IndexReader 里面,它是暂存到一个新的 Reader.clone,在新的 IndexReader 生成前,读请求得到数据是 Old IndexReader+Reader.clone 它们 merge 的结果。
Lucene 的 index 组织方式为一个 index 目录下的多个 segment。新的 doc 会加入新的 segment 里,这些新的小 segment 每隔一段时间就合并起来。因为合并,总的 segment 数量保持的较小,总体 search 速度仍然很快。为了防止读写冲突,lucene 只创建新的 segment,并在任何 active 的 reader 不在使用后删除掉老的 segment。
另外,解释下上面的几个专业词语。
flush:把数据写入到操作系统的缓冲区,只要缓冲区不满,就不会有硬盘操作。
commit:把所有内存缓冲区的数据写入到硬盘,是完全的硬盘操作。
optimize:是对多个 segment 进行合并,这个过程涉及到老 segment 的重新读入和新 segment 的合并,这个过程是不定期。
同理 Elastic Search 也支持 NRT,实例也做到了读写分离。
以上是关于Lucene -- 准实时搜索Near Real Time的主要内容,如果未能解决你的问题,请参考以下文章