ElastaticSearch--- es多字段聚合
在使用es时,我们经常会用到聚合查询。
简单的聚合查询,已经在前面介绍过,详情见: https://www.cnblogs.com/expiator/p/13843969.html
有时,也会用到多字段聚合查询。类似于Mysql的Group By多个字段。
比如,查询统计各个地区的各个日期,各自的订单总量。
es多字段聚合
DSL的格式,如下所示:
{
"size" : 0,
"query" : { },
"aggregations" : {
"自己命名的聚合名称1" : {
"terms" : {
"field" : "字段名称1",
"size" : 20000,
"order" : {
"_term" : "asc"
}
},
"aggregations" : {
"自己命名的聚合统计名称2" : {
"sum" : {
"field" : "字段名称2"
}
},
"自己命名的聚合名称3" : {
"terms" : {
"field" : "字段名称3",
"size" : 20,
"order" : {
"_term" : "asc"
}
},
"aggregations" : {
"自己命名的聚合统计名称4" : {
"sum" : {
"field" : "字段名称4"
}
}
}
}
}
}
}
}
示例如下:
{
"size" : 0,
"query" : { },
"aggregations" : {
"agg_area" : {
"terms" : {
"field" : "area",
"size" : 20000,
"order" : {
"_term" : "asc"
}
},
"aggregations" : {
"sum_area" : {
"sum" : {
"field" : "amount"
}
},
"agg_day" : {
"terms" : {
"field" : "day",
"size" : 20,
"order" : {
"_term" : "asc"
}
},
"aggregations" : {
"sum_day" : {
"sum" : {
"field" : "amount"
}
}
}
}
}
}
}
}
es多字段聚合的java api
示例的代码如下:
public String getAggDSL() {
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource();
//聚合的第二个字段
AggregationBuilder dayAgg = AggregationBuilders.terms("agg_day").field("day")
.order(Terms.Order.aggregation(TERM, true)).size(20)
.subAggregation(AggregationBuilders.sum("sum_day").field("amount"));
//聚合的第一个字段
AggregationBuilder areaDayAgg = AggregationBuilders.terms("agg_area").field("area")
.order(Terms.Order.aggregation(TERM, true)).size(10000)
.subAggregation(AggregationBuilders.sum("sum_area").field("amount"))
.subAggregation(dayAgg);
return searchSourceBuilder.query().aggregation(areaDayAgg).size(0).toString();
}
script实现es多字段聚合
es多字段聚合,对性能要求不高的话,可以使用script。
对A,B等多个字段进行聚合,那也可以直接将它们组合起来,形成A和B相关的script,
只要script的值相同,就聚合到同一组。
查询语句如下:
{
"size" : 0,
"query" : {
"bool" : {
"filter" : [
{
"term" : {
"过滤字段1" : {
"value" : "匹配值"
}
}
},
{
"term" : {
"过滤字段2" : {
"value" : "匹配值"
}
}
}
]
}
}
,"aggregations" : {
"聚合名称" : {
"terms" : {
"script" : {
"inline" : "doc['字段名称1'].values +'-'+ doc['字段名称2'].values",
"lang" : "painless"
},
"size" : 10000,
"order" : {
"排序字段" : "desc"
}
},
"aggregations" : {
"自已命令的聚合名称" : {
"sum" : {
"field" : "聚合求和字段"
}
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了