在使用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" : "聚合求和字段"
}
}
}
}
}
}