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。

posted @ 2026-07-14 18:06  实习小生  阅读(0)  评论(0)    收藏  举报