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,实例也做到了读写分离。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值