刷新vs刷新

scd*_*dmb 69 elasticsearch

如果新文档被索引到Elasticsearch索引,那么它可用于在索引操作之后搜索类似1秒的内容.但是,可以强制通过调用_flush_refresh操作索引来立即搜索此文档.这两个操作之间有什么区别 - 结果对他们来说似乎是一样的,文档可以立即搜索到.

这些操作中的每一个究竟是什么?

ES文档似乎没有深入解决这个问题.

jav*_*nna 110

你得到的答案是正确的,但我认为值得详细说明.

刷新有效地调用lucene索引读取器上的重新打开,以便更新可以搜索的数据的时间点快照.这个lucene功能是近乎实时api的lucene的一部分.

一个elasticsearch刷新使可用于搜索文档,但并不保证它们将被写入磁盘到永久存储,因为它不叫FSYNC,因此不保证耐用性.什么使您的数据持久是一个lucene提交,这是更昂贵的方式.

虽然你可以每秒调用lucene重新打开,但你不能对lucene提交做同样的事情.

通过lucene,您可以通过经常调用重新打开来近乎实时地获取可用于搜索的新文档,但是您仍然需要调用commit以确保将数据写入磁盘并保存,因此是安全的.

Elasticsearch通过为每个分片添加事务日志(实际上是lucene索引)解决了这个"问题",其中存储了尚未提交的写入操作.事务日志是fsynced和safe,因此您可以在任何时间点获得持久性,即使对于尚未提交的文档也是如此.您可以近乎实时地搜索文档,因为每秒都会自动刷新,您还可以确定如果发生了错误,可以重放事务日志以恢复最终丢失的文档.关于事务日志的好处是它可以在内部用于其他事情,例如提供实时的id by get.

一个冲洗elasticsearch有效触发Lucene的承诺,同时也清空事务日志,因为一旦数据在Lucene的水平承诺,耐久性可以通过自身的Lucene保证.Flush也作为api公开,可以调整,虽然通常没有必要.刷新会自动发生,具体取决于添加到事务日志中的操作数量,它们的大小以及上次刷新的时间.

  • 我使用扫描和滚动将我的旧索引数据重新索引到新索引.在它完成后,我调用`_flush`和/或`_refresh`然后我调用`_count` api来比较旧的和新的文档计数,期望它们是相等的.但事实并非如此.我必须多次调用这些API(在每次迭代结束时暂停1秒),直到elasticsearch最终获得正确的文档计数.有没有办法调用某些API并确认文档计数是否准确? (7认同)

Ale*_*vik 24

刷新会导致写入新段,因此可用于搜索.

刷新会导致Lucene提交.这要贵得多.

有关详细信息,我写了一篇文章,其中包含了一些内容:自下而上的Elasticsearch :)


g10*_*ang 8

  1. 刷新:将内存缓冲区转换为可搜索的内存段。
  2. 刷新:(a)将小段合并为大段(b)将大段fsync到磁盘(c)空translog。

刷新

刷新

冲洗

冲洗

Segment 是 lucene 的一部分。不可变段使操作系统页面缓存始终干净。

Translog 是 Elasticsearch 的一部分。Translog 的目标是耐用性。

参考:

  1. Elasticsearch 中的刷新和刷新操作指南
  2. 使文档持久化的官方文档