聚合的两个概念
一 桶(Buckets) : 满足特定条件的文档的集合
1 当聚合开始被执行,每个文档会决定符合哪个桶的条件,如果匹配到,文档将放入相应的桶并接着进行聚合操作
如:当query和aggs一起存在时,会先执行query的主查询,主查询query执行完后会搜出一批结果,而这些结果才会被拿去aggs拿去做聚合
二 指标(Metrics) : 对桶内的文档进行统计计算
1 桶能让我们划分文档到有意义的集合, 但是最终我们需要的是对这些桶内的文档进行一些指标的计算
2 指标通常是简单的数学运算(像是min、max、avg、sum),而这些是通过当前桶中的文档的值来计算的,利用指标能让你计算像平均薪资、最高出售价格、95%的查询延迟这样的数据
三 aggs聚合
1 一个aggs裡可以有很多个聚合,每个聚合彼此间都是独立的,因此可以一个聚合拿来统计数量、一个聚合拿来分析数据、一个聚合拿来计算标准差.
2 aggs可以嵌套在其他的aggs裡面,而嵌套的桶能作用的文档集范围,是外层的桶所输出的结果集
GET 127.0.0.1/mytest/doc/_search
{
"query": { ... },
"size": 0,
"aggs": {
"name1": { //aggs后面接著的是一个自定义的name
"桶": { ... } //再来才是接桶
},
"name2": { //一个aggs裡可以有很多聚合
"桶": { ... }
},
"name3": {
"桶": {
.....
},
"aggs": { //aggs可以嵌套在别的aggs裡面
"in_name": { //记得使用aggs需要先自定义一个name
"桶": { ... } //in_name的桶作用的文档是name3的桶的结果
}
}
}
}
}
# 结果
{
"hits": {
"total": 8,
"max_score": 0,
"hits": [] //因为size设为0,所以没有查询结果返回
},
"aggregations": {
"name1": {
...
},
"name2": {
...
},
"name3": {
... ,
"in_name": {
....
}
}
}
}
四 聚合中常用的桶 terms、filter、top_hits
1 terms桶 : 针对某个field的值进行分组,field有几种值就分成几组
* 注意此 "terms桶" 和平常用在主查询query中的 "查找terms" 是不同的东西
2 filter桶 : 一个用来过滤的桶
*注意此处的 "filter桶" 和用在主查询query的 "过滤filter" 的用法是一模一样的,都是过滤*
filter桶和terms桶嵌套使用,先过滤出的文档,再对这些文档进行分组
3 top_hits桶 : 在某个桶底下找出这个桶的前几笔hits,返回的hits格式和主查询query返回的hits格式一模一样
五 对嵌套字段中某个字段分组
"aggs": {
"label_count": {
"terms":
{"field": "article_type"},
"aggs": {
"related_cp": {
"nested": {
"path": "related_cp_score",
},
"aggs": {
"related_cp_score_label": {
"terms": {
"field": "related_cp_score.label"
}
}
}
},
}
}
}
参考文档: 嵌套对象 | Elasticsearch: 权威指南 | Elastic