背景
在生产环境遇到这样一个问题:先在索引中删除数据,在接下来的逻辑里需要判断数据是否删除,发现数据仍然存在;但在 kibana 的命令行里查询数据,又发现数据的确被删除了。
概括问题的现象是这样的:删除数据没有立即生效,立刻去查询依然可以查询到,间隔一小段时间后就查询不到了。
解决
理论部分
这其实是 ElasticSearch 的近实时特性导致的:Elasticsearch 是一个近实时的搜索引擎,默认情况下,数据写入(包括删除)后的更改不会立即在搜索结果中可见。默认的刷新间隔时间为 1 秒(可以通过 index.refresh_interval
配置)。
当执行删除操作后,删除请求会立即更新内部索引,但这些更改不会立即对外可见,只有在下一个刷新周期后才会对搜索操作可见。
代码部分
在执行完删除或者写入操作后,手动来刷新索引,使数据操作立刻对外可见:
// 刷新索引
client.indices().refresh(new RefreshRequest(indexName), RequestOptions.DEFAULT);
这个问题我是在生产环境遇到的,在我本地环境搭建的 ES 服务中写入 10W 条数据复现这个问题,仍然没有复现出来。这可能与 ES 集群的环境有关。
总结
ElasticSearch 是一个近实时的搜索工具,对数据进行操作后无法立刻对外可见,需要手动刷新索引来使数据对外可见。