ES-聚合查询
创始人
2025-05-29 01:22:32

1. 概念

聚合(aggs)不同于普通查询,是目前学到的第二种大的查询分类,第一种即“query”,因此在代码中的第一层嵌套由“query”变为了“aggs”。用于进行聚合的字段必须是exact value,分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(docvalues)变为了堆内存(fielddata),大数据的聚合操作很容易导致OOM,详细原理会在进阶篇中阐述。

聚合分类
分桶聚合(Bucket agregations):类比SQL中的group by的作用,主要用于统计不同类型数据的数量
指标聚合(Metrics agregations):主要用于最大值、最小值、平均值、字段之和等指标的统计
管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合,如要统计绑定数量最多的标签bucket,就是要先按照标签进行分桶,再在分桶的结果上计算最大值。
语法

json GET product/_search 
{"aggs": {"": {"": {"field": ""}}}
}

aggs_name:聚合函数的名称

agg_type:聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)

field_name:字段名称或者叫域名。

2. 桶聚合:

场景:用于统计不同种类的文档的数量,可进行嵌套统计。

函数:terms

注意:聚合字段必须是exact value,如keyword

3. 指标聚合

场景:用于统计某个指标,如最大值、最小值、平均值,可以结合桶聚合一起使用,如按照商品类型分桶,统计每个桶的平均价格。

函数:平均值:Avg、最大值:Max、最小值:Min、求和:Sum、详细信息:Stats、数量:Value count

4. 管道聚合

场景:用于对聚合查询的二次聚合,如统计平均价格最低的商品分类,即先按照商品分类进行桶聚合,并计算其平均价格,然后对其平均价格计算最小值聚合

函数:Min bucket:最小桶、Max bucket:最大桶、Avg bucket:桶平均值、Sum bucket:桶求和、Stats bucket:桶信息

注意:bucketspath为管道聚合的关键字,其值从当前聚合统计的聚合函数开始计算为第一级。比如下面例子中,myaggs和myminbucket同级, myaggs就是bucketspath值的起始值。

json GET product/_search 
{"size": 0,"aggs": {"my_aggs": {"terms": {...},"aggs": {"my_price_bucket": {...}}},"my_min_bucket": {"min_bucket": {"buckets_path": "my_aggs>price_bucket"}}}
}

5. 嵌套聚合

语法:

json GET product/_search 
{"size": 0,"aggs": {"": {"": {"field": ""},"aggs": {"": {"": {"field": ""}}}}}
}

用途:用于在某种聚合的计算结果之上再次聚合,如统计不同类型商品的平均价格,就是在按照商品类型桶聚合之后,在其结果之上计算平均价格

聚合和查询的相互关系

6. 基于query或filter的聚合

语法:

json GET product/_search 
{"query": {...},"aggs": {...}
}

注意:以上语法,执行顺序为先query后aggs,顺序和谁在上谁在下没有关系。query中可以是查询、也可以是filter、或者bool query

7. 基于聚合结果的查询、

GET product/_search 
{"aggs": {...},"post_filter": {...}
}

注意:以上语法,执行顺序为先aggs后post_filter,顺序和谁在上谁在下没有关系。

8. 查询条件的作用域

json GET product/_search 
{"size": 10,"query": {...},"aggs": {"avg_price": {...},"all_avg_price": {"global": {},"aggs": {...}}}
}

上面例子中,avgprice的计算结果是基于query的查询结果的,而allavg_price的聚合是基于all data的

聚合排序

9. 排序规则:

ordertype:count(数量) _key(聚合结果的key值) _term(废弃但是仍然可用,使用_key代替)

json GET product/_search 
{"aggs": {"type_agg": {"terms": {"field": "tags","order": {"": "desc"},"size": 10}}}
}

10. 多级排序:即排序的优先级,按照外层优先的顺序

json GET product/_search?size=0 
{"aggs": {"first_sort": {..."aggs": {"second_sort": {...}}}}
}

上例中,先按照firstsort排序,再按照secondsort排序

11. 多层排序:即按照多层聚合中的里层某个聚合的结果进行排序

json GET product/_search 
{"size": 0,"aggs": {"tag_avg_price": {"terms": {"field": "type.keyword","order": {"agg_stats>my_stats.sum": "desc"}},"aggs": {"agg_stats": {..."aggs": {"my_stats": {"extended_stats": {...}}}}}}}
}

上例中,按照里层聚合“my_stats”进行排序

常用的查询函数

12. histogram:直方图或柱状图统计

用途:用于区间统计,如不同价格商品区间的销售情况

语法:

json GET product/_search?size=0 
{"aggs": {"": {"histogram": {"field": "price",#字段名称"interval": 1000,#区间间隔"keyed": true,#返回数据的结构化类型"min_doc_count": ,#返回桶的最小文档数阈值,即文档数小于num的桶不会被输出"missing": 1999#空值的替换值,即如果文档对应字段的值为空,则默认输出1999(参数值)}}}
}

date-histogram:基于日期的直方图,比如统计一年每个月的销售额

语法:

json GET product/_search?size=0 { “aggs”: { “my_date_histogram”: { “date_histogram”: { “field”: “createtime”, #字段需为date类型 “”: “month”, #时间间隔的参数可选项 “format”: “yyyy-MM”, #日期的格式化输出 “extended_bounds”: { #输出空桶 “min”: “2020-01”, “max”: “2020-12” } } } } }

interval_type:时间间隔的参数可选项

​ fixed_interval:ms(毫秒)、s(秒)、 m(分钟)、h(小时)、d(天),注意单位需要带上具体的数值,如2d为两天。需要当心当单位过小,会 导致输出桶过多而导致服务崩溃。

​ calendar_interval:month、year

​ interval:(废弃,但是仍然可用)

13. percentile 百分位统计 或者 饼状图

计算结果为何为近似值。

percentiles:用于评估当前数值分布情况,比如99 percentile 是 1000 , 是指 99%的数值都在1000以内。常见的一个场景就是我们制定 SLA 的时候常说 99% 的请求延迟都在100ms 以内,这个时候你就可以用 99 percentile 来查一下,看一下 99 percenttile 的值如果在 100ms 以内,就代表SLA达标了。

语法:

json GET product/_search?size=0 { “aggs”: { “”: { “percentiles”: { “field”: “price”, “percents”: [ percent1, #区间的数值,如5、10、30、50、99 即代表5%、10%、30%、50%、99%的数值分布 percent2, … ] } } } }

percentile_ranks: percentile rank 其实就是percentiles的反向查询,比如我想看一下 1000、3000 在当前数值中处于哪一个范围内,你查一下它的 rank,发现是95,99,那么说明有95%的数值都在1000以内,99%的数值都在3000以内。

json GET product/_search?size=0 { “aggs”: { “”: { “percentile_ranks”: { “field”: “”, “values”: [ rank1, rank2, … ] } } } }

相关内容

热门资讯

增长53%!1至4月雄安民营企... 河北日报客户端讯(康晓博、王敏)从雄安海关获悉,今年1至4月,雄安新区进出口总值14.7亿元,同比增...
深圳华大智造科技股份有限公司关... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
金价狂飙,金表也不好卖了 泡泡玛特、老铺黄金、蜜雪冰城股价屡创新高,被港股市场称为“新消费三姐妹”。与它们有着异曲同工之妙的金...
汉口银行拟吸收业绩下滑资产,谋... 文 | 刘振涛谋求IPO的汉口银行,拟吸收合并村镇银行,谋划异地扩张。近日,汉口银行发布公告,将在6...
大连银行迎新帅 能否走出“消失... “ 过去十年,大连银行业绩可谓是原地踏步,2018年到2023年,净利润更是六连降。去年,大连银行结...
雷军凶猛,兵临董明珠城下 雷军... 家电大战,全面开打。文 | 华商韬略 东木褚小米的大家电业务爆发了,营收首次突破1000亿大关。去年...
财报里的十大跨境巨头:出海增长... 作者 | 唐飞编辑 | 谭格2024年的跨境电商江湖,正经历着前所未有的冰火两重天。一边是安克创新靠...
A股、港股云计算概念双双走强,... 6月5日,三大指数集体高开,盘中创业板指走高,港股方面,恒生科技指数涨幅走阔。A股、港股云计算概念双...
财报解读|蔚来一季度营收增长2... 21世纪经济报道记者 郑植文 上海报道6月3日,蔚来汽车发布了2025年第一季度财报。数据显示,20...
广发基金王明旭:面对市场逆风,... (来源:资事堂)过去五年里,我们对话了数百名基金经理,广发基金王明旭无疑是极具特点且与众不同的。第一...
小商品城股价创历史新高 小商品... 6月5日,小商品城股价振荡上扬,最高涨至18.99元/股,创下历史新高。截至记者发稿,公司市值达10...
张裕A被调出深证成指,总经理孙... 瑞财经 刘治颖 6月3日,深交所发布公告称,将于6月16日对深证成指、创业板指、深证100等指数实施...
信音电子:6月4日融资买入26... 证券之星消息,6月4日,信音电子(301329)融资买入268.8万元,融资偿还146.89万元,融...
李斌:蔚来正在走出最低谷,二季... 成立11年,蔚来遭遇多次起伏。 2019年时,蔚来靠外部融资成功复活;而今年一季度,在外部唱衰之下,...
海科新源:6月4日融资买入38... 证券之星消息,6月4日,海科新源(301292)融资买入381.85万元,融资偿还265.17万元,...
长安、东风重组中止 兵装集团汽... 经观要闻 经过116天的磋商与谈判之后,两大汽车央企东风与长安的重组计划中止。 长安汽车(0006...
“苏超”引爆A股足球概念持续狂... 6月5日早盘,足球概念再度走强,截至发稿,金陵体育、共创草坪涨停,星辉娱乐涨超9%,探路者、康力源、...
人工智能产业迎政策利好,恒生互... 6月5日早盘,港股集体走强。截至发稿,恒生互联网科技业指数涨2.38%,微盟集团涨超6%,快手-W、...
商业航天概念股爆发,超捷股份超... 6月5日,商业航天概念股爆发,超捷股份超逾15%,天银机电、上海瀚讯、航宇微涨逾3%。
「开盘」A股三大股指集体小幅高... A股三大股指6月5日集体小幅高开。其中,沪指涨0.06%报3378.22点,深成指涨0.08%报10...
长安与东风不再合并,兵器装备集... 红星资本局6月5日消息,今日早间,长安汽车(000625.SZ)、中光学(002189.SZ)、湖南...
CRO概念股走低,金凯生科跌逾... 6月5日,CRO概念股走低,金凯生科跌逾8%,鸿博医药、泰格医药、成都先导、昭衍新药跌逾2%。
体育概念再度活跃,共创草坪四连... 6月5日,体育概念再度活跃,共创草坪四连板,冰山冷热、元隆雅图快速拉升涨停,金陵体育冲击涨停。
6月5日投资避雷针:7天5板人... 导读:财联社6月5日投资避雷针,近日,A股及海外市场潜在风险事件如下。国内经济信息方面包括:1)本周...
楼市已经触底,明年会回暖吗?国... 我最近一直在研究房地产市场,发现2024年的数据确实挺吓人的: 全国新建商品房销售面积同比下降12....
百亿市值大族数控冲击IPO:5... 瑞财经 王敏 5月30日,据港交所官网,深圳市大族数控科技股份有限公司(以下简称“大族数控”)向港交...
李在明上台,韩国转机将至? 李... 6月4日上午11时许,韩国新任总统李在明在国会正式宣誓就职,开启五年任期。李在明在就职讲话中表示,将...
恒指高开0.74% 恒指高开0... 【恒指高开0.74%】香港恒生指数高开0.74%,恒生科技指数高开0.97%。蔚来涨超3%,阿里巴巴...
V观财报|温氏股份实控人调整,...   中新经纬6月5日电 温氏股份4日晚间公告,公司的实际控制人自2025年6月4日起调整为温鹏程、温...