ElasticSearch Refresh 介绍

什么是 Refresh

当新文档被索引时,首先是在 indexing buffer,然后被放到新的 Segment 写入磁盘,但磁盘是很慢的,如果等 fsync 写入磁盘后,再把 Segment 标记为 Searchable,这将是。

ES 使用了一种更轻量级的方式,叫做 refresh。

由于 Segment 和 磁盘之间是文件系统缓冲区,写入时 Segment 首先是在到文件系统缓冲区中,然后才被 flush 到磁盘。

只要 Segment 在文件系统缓冲区时,其实就可以打开并进行搜索了,这样开销就比等到完全 flush 到磁盘小得多,Lucene 支持这个操作。

而在 ES 中, 这个操作叫做 Refresh

While a refresh is much lighter than a commit, it still has a performance cost. A manual refresh can be useful when writing tests, but don’t do a manual refresh every time you index a document in production; it will hurt your performance. Instead, your application needs to be aware of the near real-time nature of Elasticsearch and make allowances for it.

Refresh

ES 被称为近实时的搜索,是因为默认 Refresh 每隔一秒(refresh_interval)自动执行,意味着文档的修改需要在一秒内的时间才可见。

虽然 Refresh 比 Commit 更轻量,但并不意味着没有性能开销。

我们需要了解 ES 的近实时搜索的原理,根据自己的业务场景来进行 Refresh。

如果我们需要进行大量的数据导入,且没有近实时的搜索需求,其实可以把 refresh_interval 设置大一点(比如 30 秒),或者关闭自动 Refresh(设置为-1),之后再打开 Refresh。

References


Near Real-Time Search | Elasticsearch: The Definitive Guide [2.x] | Elastic
搜索那点事儿:Lucene文件存储和读取技术详解