转自:
https://blog.csdn.net/OliverCaro/article/details/120763278
一、ElasticSearch的分组聚合
官网文档地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_multi_field_terms_aggregation
实现背景:实现类似SQL的group by功能:
select team,age from a_person group by team,age;
二、多字段分组聚合的三种实现方法(性能不高)
在ElasticSearch中,实现多字段分组聚合的方式包括:
1、使用 Script
使用脚本script从多个字段聚合分组:
dsl:
GET /_search
{
"query": {
"match_all": {}
},
"aggs": {
"group_ab": {
"terms": {
"script": {
"source": "doc['a'].value +','+ doc['b'].value",
"lang": "painless"
}
}
}
}
}
}
2、使用 copy_to 字段(需要提前mapping,暂不考虑)
在创建索引的mapping时创建一个新的专用copy_to字段,后续可以在这个字段上进行汇总查询。
3、multi_terms 聚合
Multi Terms aggregation | Elasticsearch Guide [7.13] | Elastic
multi_terms 聚合将来自多个字段的术语组合成一个复合key。会禁用全局序数,并且比从单个term聚合要慢。
注意7.12版本新特性,旧版本不用考虑
dsl:
GET /products/_search
{
"aggs": {
"genres_and_products": {
"multi_terms": {
"terms": [{
"field": "genre"
}, {
"field": "product"
}]
}
}
}
}