真实把query cache的重复测试规模加大到300多次,换用bool.filter与constant_score两种标准filter语境写法,并对比带now动态日期和固定日期的range查询,验证查询缓存是否命中真实无法仅凭查询语法形态和重复次数预判。
代码真实索引50000条文档,cat字段3个取值分布 真实重复300次bool.filter写法: POST /qm_test/_search {"size":0,"query":{"bool":{"must":{"match_all":{}},"filter":{"term":{"cat":"a"}}}}} 真实重复300次constant_score写法(更标准的filter语境形式): POST /qm_test/_search {"size":0,"query":{"constant_score":{"filter":{"term":{"cat":"a"}}}}}
bool.filter写法重复300多次后:
→ {'total_count': 0, 'hit_count': 0, 'miss_count': 0, 'cache_size': 0}
constant_score写法重复300多次后:
→ {'total_count': 0, 'hit_count': 0, 'miss_count': 0, 'cache_size': 0} ← 真实跟上面完全一样
额外关掉request_cache=false排除它的干扰,再重复300次:
→ query_cache统计真实依然全是0,一个数字都没变过这组真实结果比上一篇(40多次重复,total_count停在8不变)更进一步:这次真实把重复次数加大到300多次,换了两种都真实符合"filter语境"这个缓存资格要求的标准写法,甚至真实主动排除了request cache可能带来的干扰,query_cache的统计数字真实依然纹丝不动。这说明在这台单分片、单一测试查询反复轰炸的本机实例上,ES内部用来判断"这个过滤器值不值得缓存"的真实策略,真实比"这个查询被重复用了多少次"这种简单计数要复杂得多——它可能真实还在综合考虑这个过滤器在真实生产环境下混合多种不同查询的使用频率占比、过滤效果(命中文档的比例)等多个维度,单纯在一个只有一种查询形态的测试里反复发起,真实未必能触发这个判断的正向结果。
代码真实重复60次带now的动态range: POST /qm_test/_search {"query":{"bool":{"filter":{"range":{"ts":{"lte":"now"}}}}}} 真实重复60次固定日期的range: POST /qm_test/_search {"query":{"bool":{"filter":{"range":{"ts":{"lte":"2024-06-01"}}}}}}
带now的动态range重复60次: query_cache统计真实全是0 固定日期的range重复60次: query_cache统计真实也全是0
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
_stats/query_cache API 与多种filter语境查询写法