【Elasticsearch】调用_flush api会调用_refresh 吗?
调用 `_flush` API 时会隐式地执行 `_refresh` 操作。
为什么 `_flush` 会执行 `_refresh`?
在 Elasticsearch 中,`_flush` 操作的目的是将内存中的数据和事务日志(translog)中的操作持久化到磁盘。为了确保数据的一致性和完整性,在 `_flush` 操作开始之前,Elasticsearch 会先执行 `_refresh` 操作,将内存缓冲区中的数据写入到新的 Lucene segment 中并加载到文件系统缓存中。这样可以确保在将数据持久化到磁盘之前,所有的数据都已经处于可搜索的状态。
`_flush` 的具体流程
1. 执行 `_refresh`:
- 将内存缓冲区中的数据写入到新的 Lucene segment 中。
- 将新的 segment 加载到文件系统缓存中。
- 此时,数据已经可以被搜索到。
2. 持久化到磁盘:
- 将文件系统缓存中的 segment 强制写入磁盘(通过 `fsync` 操作)。
- 清空事务日志(translog),释放内存和存储空间。
总结
调用 `_flush` API 时,Elasticsearch 会先执行 `_refresh` 操作,以确保数据在持久化到磁盘之前已经处于可搜索的状态。因此,`_flush` 操作不仅确保了数据的持久性,还间接保证了数据的搜索可见性。
如果你只需要确保数据的搜索可见性,而不需要立即持久化数据,可以单独调用 `_refresh` API。