更新时间:2024-11-29 GMT+08:00

聚合优化

大多时候对单个字段的聚合查询还是比较快的,但是当需要聚合多个字段时,就会产生大量的分组,最终结果就是占用Elasticsearch大量的内存,从而导致内存溢出的情况发生。尽量根据业务优化,减少聚合次数。

默认深度优化聚合改为广度优先聚合

添加设置:"collect_mode": "breadth_first"。

depth_first:直接进行子聚合的计算。

breadth_first:先计算出当前聚合的结果,针对这个结果在对子聚合进行计算。

优化聚合执行方式

在每一层terms aggregation内部加一个 “execution_hint”: “map”。

添加设置:"execution_hint": "map"。

  1. 查询结果直接放入到内存中构建map,在查询结果集小的场景下,速度极快;
  2. 但如果查询结果集合很大(百万-亿级别)的时候,传统聚合方式会比map方式快。

安全模式下聚合查询示例:

curl -XGET --tlsv1.2 --negotiate -k -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "size" : 0,
  "aggregations": {
    "count_age" : {
	"terms" : {
		   "field" : "age"
		} 
	}
  }
}'

安全模式下聚合优化后查询示例:

curl -XGET --tlsv1.2 --negotiate -k -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "size" : 0,
  "aggregations": {
    "count_age" : {
	"terms" : {
		   "field" : "age",
		   "execution_hint": "map",
		   "collect_mode": "breadth_first"
		} 
	}
  }
}'