ES聚合查询优化之execution_hint
ES聚合查询优化之execution_hint
ES聚合查询是很多人的痛点,通常会出现速度很慢的情况发生。
例如:
GET 索引名字/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"uid": "xxx"
}
}
]
}
},
"aggs": {
"trace": {
"terms": {
"field": "trace",
"size": 10000
}
}
}
}
如果索引数据量很多的时候,在千万亿 亿级,且 trace的基数很大的时候,这个查询会特别慢。
查询分析
默认情况下 es的聚合查询并不想看起来那样,先query 然后在query结果的基础上进行aggs。在上面的DSL基础上,虽然会先执行query,但是在聚合阶段es会扫描索引中所有的trace,然后在内存中做一个字典映射表,数据量大、trace基数也大,查询速度肯定很慢的。
查询优化
GET 索引名字/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"uid": "xxx"
}
}
]
}
},
"aggs": {
"trace": {
"terms": {
"field": "trace",
"size": 10000,
"execution_hint": "map"
}
}
}
}
execution_hint 的默认值为global_ordinals,如果修改为map的话,则可以提速。具体说法如下:
"execution_hint": "map" 这个参数可以改变上述的aggs逻辑,这个参数可以指定es先进行query,然后在query结果集的基础上在内存中做aggs(直接提取命中文档中的 trace 原始值进行分组统计),该方式主要适用于query结果集比较小的情况下,query结果集越大,该方式需要的内存就越多,甚至可能导致oom。

浙公网安备 33010602011771号