CS-Notes 学习笔记
Java 后端 · MySQL

ES 写入一条文档后为什么不能马上搜到?数据会不会丢?

先自己想一想,再看参考要点

参考要点

  • Lucene 的索引由不可修改的段组成,搜索只能搜已经打开的段,新文档先放在内存缓冲区
  • refresh 把缓冲区写成一个新段并打开,默认每 1 秒一次,所以写入后约 1 秒才能搜到,称为近实时
  • 按 ID 读取是实时的,不受 refresh 影响
  • 要求写完立即可见时用 refresh=wait_for 等下一次 refresh 再返回,或者 refresh=true 立即刷新,频繁使用会产生大量小段
  • refresh 出的段还在文件系统缓存中,不丢数据靠 translog:默认每个写请求返回前主分片和副本都把 translog fsync 到磁盘,设为 async 则每 5 秒一次,宕机会丢最近的写入
  • flush 执行 Lucene 提交,把段 fsync 到磁盘并开始新的 translog,重启时从提交点重放 translog
  • 段越来越多由后台合并,合并时才真正清除已删除的旧版本
在学习站中自测这道题

学习站:先用面试题自评定级,按水平和面试日期排出每天的计划,自评过的题按间隔复习。免费、无需注册,记录只保存在自己的浏览器中。