刷新vs刷新

时间:2013-11-13 20:13:49

标签: elasticsearch

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

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

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

3 个答案:

答案 0 :(得分:103)

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

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

elasticsearch refresh使您的文档可供搜索,但它不能确保将它们写入磁盘到永久存储,因为它不会调用fsync,因此无法保证持久性。是什么让你的数据持久是一个lucene提交,这是更昂贵的。

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

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

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

elasticsearch flush有效地触发了lucene提交,并清空了事务日志,因为一旦数据在lucene级别上提交,lucene本身就可以保证持久性。 Flush也作为api公开,可以调整,虽然通常没有必要。刷新会自动发生,具体取决于添加到事务日志中的操作数量,它们的大小以及最后一次刷新的时间。

答案 1 :(得分:22)

刷新会导致写入新段,因此可以进行搜索。

刷新会导致Lucene提交发生。这要贵得多。

有关详细信息,我撰写了一篇文章,其中介绍了其中一些内容:Elasticsearch from the bottom up:)

答案 2 :(得分:2)

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

刷新

refresh

冲洗

flush

段是Lucene的一部分。不可变的段使OS页面缓存始终保持干净。

Translog是Elasticsearch的一部分。 Translog旨在提高耐用性。

参考:

  1. Guide to Refresh and Flush Operations in Elasticsearch
  2. Official Doc for make doc persistent