Elasticsearch 的聚合查询及过滤

2015-09-01 13:51:23   最后更新: 2015-09-01 21:58:38   访问数量:12515




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      聚合     


1#hu: (回复)2017-11-23 14:47:36

你的那个代码显示很不友好呀

2#hu: (回复)2017-11-23 14:48:32

回复:1#肏,刷新就好啦,网速问题

京ICP备2021035038号