问题场景:从ES2.X升级到ES7.X后,发现每个索引的前几次查询都比较耗时,在600ms左右,在连续查询多次后,耗时稳定在10ms左右。
原因:ES7.X版本开始,引入“搜索空闲(search idle)”的概念
未配置显式 index.refresh_interval 的索引的分片在分片变为“搜索空闲”后将不再在后台刷新(refresh),即分片没有看到任何 index.search.idle.after 秒后的搜索流量(默认为 30 秒)。访问搜索空闲分片的搜索将被“停放”,直到下一次刷新发生。
所以当一个分片长时间未接收到搜索请求,在下一次查询请求执行前,会进行一次刷新操作,导致查询耗时,但一旦分片处于活跃状态,查询请求不会触发刷新,查询耗时就是正常的。
解决办法:显式配置refresh间隔,避免搜索空闲状态下的索引在接收到搜索请求时进行refresh。
PUT /index/_settings
{
"index.refresh_interval": "1s"
}