Lucene 创建索引

Segment

Lucene 将索引数据存储在 segment 中,segment 一旦写入磁盘,就不可再变:不可修改、不会删除。删除仅仅是逻辑删除,并不会物理删除;修改则是逻辑删除+写入新 segment。

写入链路

img

当有新索引需要写入,需要如下步骤:

  1. 写入索引缓冲区(index buffer),同时记录 translog,即事务日志,用于崩溃恢复;
  2. Refresh:每隔 1s 将 buffer 中的 doc 刷新到 filesystem cache 中成为新的 segment,此时文档就可以被检索到了。 但还没有持久化到磁盘中。
    • 间隔时间 refresh_interval 可以在 setting 中自定义,我们之前业务设定为 10s,意味着增量数据写入后大约 10s 可以被检索到,es 提供近实时搜索,属于业务可接受范围。
  3. Flush:每当 30 分钟(默认) ,或者 filesystem cache 积累到一定程度、或者 translog 过大时,filesystem cache 会 flush 到磁盘中:
    1. 执行一次 refresh,清空 buffer;
    2. 调用 fsync 将 filesystem cache 中的 segment 持久化到磁盘;
    3. 清空 translog。
  4. merge:refresh 每次会产生一个新的 segment,segment 会越来越多,后台线程定期会将小 segment 合并成大的 segment

Refenrece

https://pdai.tech/md/db/nosql-es/elasticsearch-y-th-3.html