elasticsearch 通过 aggs 实现聚合功能
聚合提供了分组统计的能力,类似于 SQL 的 GROUP BY 和 SQL 聚合
在Elasticsearch中,你可以在一个响应中同时返回命中的数据和聚合结果
下面的查询实现了按照州名的计数倒序排序:
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state"
}
}
}
}
在 SQL 中,上面的聚合类似于:
SELECT COUNT(*) from bank GROUP BY state ORDER BY COUNT(*) DESC
- 注:如果 size 不为 0,则查询的所有命中结果都会出现在查询结果中
下面的例子展示了按照年龄段分组(20-29,30-39,40-49),然后再用性别分组,然后为每一个年龄段的每一个性别计算出平均账户余额
{
"size": 0,
"aggs": {
"group_by_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_gender": {
"terms": {
"field": "gender"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}
aggs 提供了过滤桶的功能,以便让你可以通过多个查询条件进行查询,当文档匹配了该过滤器的规则时,他就会被添加到桶中
下面的查询查询了 ford 汽车的平均价格以及售出时间为上个月的 ford 汽车的平均价格
{
"query":{
"match": {
"make": "ford"
}
},
"aggs":{
"recent_sales": {
"filter": {
"range": {
"sold": {
"from": "now-1M"
}
}
},
"aggs": {
"average_price":{
"avg": {
"field": "price"
}
}
}
}
}
}
因为过滤器桶和任何其它桶以相似的方式工作,你可以任意地将其它桶和指标包含在其中。所有的嵌套组建都会"继承"该过滤器。从而使你能够根据需要对聚合中的内容进行过滤
在 elasticsearch 文档的检索 中我们介绍了 filtered 过滤器
他与上面介绍的 filter 过滤桶的区别在于:filtered 查询既过滤检索结果也过滤聚合过滤器,而 filter 过滤桶则只过滤聚合结果
那么,是否有只过滤检索结果的过滤器呢?
那就是即将介绍的 post_filter 后置过滤器
post_filter元素是一个顶层元素,只会对搜索结果进行过滤
下面查询所有的绿色 ford 车,并在聚合结果中列出所有的颜色列表:
{
"query": {
"match": {
"make": "ford"
}
},
"post_filter": {
"term" : {
"color" : "green"
}
},
"aggs" : {
"all_colors": {
"terms" : { "field" : "color" }
}
}
}
post_filter会对搜索结果进行过滤,只显示绿色的ford汽车,而并不会对 aggs 产生的聚合结果进行过滤
下面的查询查看了 category 的所有取值:
{
"aggs": {
"uniq_streets": {
"terms": {
"field" : "category",
"size" : 0
}
}
}
}
进而,我们可以看到每个分类下的总价格:
{
"aggs": {
"uniq_streets": {
"terms": {
"field" : "category",
"size" : 0
},
"aggs" : {
"totalfee" : {
"sum" : {
"field" : "money"
}
}
}
}
}
}
欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

读书笔记
技术帖
龙潭书斋
检索
search
检索引擎
elasticsearch
查询
filter
过滤
filtered
aggs
aggregations
聚合