刷新VS刷新

如果一个新文档被索引到Elasticsearch索引,那么在索引操作之后它可用于search类似于1秒的东西。 但是可以通过在索引上调用_flush_refresh操作来迫使它立即search。 这两个操作之间有什么区别 – 结果似乎是相同的,文件可以立即search。

这些操作中的每一个到底是什么?

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

你得到的答案是正确的,但我认为这是值得详细阐述一点。

刷新有效地调用了lucene索引阅读器的重新打开,以便您可以search的数据的时间点快照得到更新。 这个lucene特性是lucene近实时API的一部分。

elasticsearch刷新使您的文档可用于search,但它不能确保它们被写入磁盘到永久存储,因为它不调用fsync,因此不保证持久性。 什么让你的数据持久是一个lucene提交,这是更昂贵的方式。

虽然你可以调用lucene重新打开每一秒,你不能做同样的lucene提交。

通过lucene,你可以通过经常调用重新打开来获得近乎实时的新文档,但是仍然需要调用commit来确保数据写入磁盘并且是安全的。

Elasticsearch通过为每个分片添加一个事务日志(有效的是一个lucene索引)来解决这个“问题”,其中存储了尚未提交的写入操作。 事务日志是安全的,因此您可以在任何时候获得持久性,即使对于尚未提交的文档。 您可以在接近实时的情况下search文档,因为每秒都会自动进行刷新,并且您还可以确定,如果发生错误,可以重播事务日志以最终还原丢失的文档。 关于事务日志的好处在于,它可以在内部用于其他事情,例如通过id提供实时获取 。

elasticsearch flush有效地触发lucene提交,并且还清空事务日志,因为一旦在lucene级别提交数据,lucene本身就可以保证持久性。 同花顺作为一个API也暴露,可以调整,虽然通常这是没有必要的。 刷新会自动发生,具体取决于事务日志中添加了多less操作,它们有多大,以及最后一次刷新发生的时间。

刷新会导致一个新的段被写入,所以它可用于search。

同花顺导致一个Lucene的提交发生。 这是非常昂贵的。

有关更多详细信息,我已经写了一篇文章,涵盖了一些: 从下到上的Elasticsearch 🙂