ElasticSearch+聚合+Aggregation+示例

聚合提供了分组并统计数据的能力。理解聚合的最简单的方式是将其粗略地等同为SQL的GROUP BY和SQL聚合函数。在Elasticsearch中,你可以在一个响应中同时返回命中的数据和聚合结果。你可以使用简单的API同时运行查询和多个聚合,并以一次返回,这避免了来回的网络通信,这是非常强大和高效的。

作为开始的一个例子,我们按照state分组,按照州名的计数倒序排序:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" } } } }'

在SQL中,上面的聚合在概念上类似于:

SELECT COUNT(*) from bank GROUP BY state ORDER BY COUNT(*) DESC

响应(其中一部分)是:

"hits" : { "total" : 1000, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "group_by_state" : { "buckets" : [ { "key" : "al", "doc_count" : 21 }, { "key" : "tx", "doc_count" : 17 }, { "key" : "id", "doc_count" : 15 }, { "key" : "ma", "doc_count" : 15 }, { "key" : "md", "doc_count" : 15 }, { "key" : "pa", "doc_count" : 15 }, { "key" : "dc", "doc_count" : 14 }, { "key" : "me", "doc_count" : 14 }, { "key" : "mo", "doc_count" : 14 }, { "key" : "nd", "doc_count" : 14 } ] } } }

我们可以看到AL(abama)有21个账户,TX有17个账户,ID(daho)有15个账户,依此类推。

注意我们将size设置成0,这样我们就可以只看到聚合结果了,而不会显示命中的结果。

在先前聚合的基础上,现在这个例子计算了每个州的账户的平均余额(还是按照账户数量倒序排序的前10个州):

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }'

注意,我们把average_balance聚合嵌套在了group_by_state聚合之中。这是所有聚合的一个常用模式。你可以任意的聚合之中嵌套聚合,这样你就可以从你的数据中抽取出想要的概述。

基于前面的聚合,现在让我们按照平均余额进行排序:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state", "order": { "average_balance": "desc" } }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }'

下面的例子显示了如何使用年龄段(20-29,30-39,40-49)分组,然后在用性别分组,然后为每一个年龄段的每一个性别计算平均账户余额:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "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" } } } } } } } }'

Elasticsearch的Aggregation功能也异常强悍。

Aggregation共分为三种:Metric Aggregations、Bucket Aggregations、 Pipeline Aggregations。下面将分别进行总结。

以下所有内容都来自官网:喜欢原汁原味的参看下方网址,不喜欢英文的参看本人总结。

官网(权威):https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-aggregations-metrics-avg-aggregation.html

#########################################

1、Metric Aggregations

1>Avg Aggregation  #计算出字段平均值

{ "aggs" : { "avg_grade" : { "avg" : { "field" : "grade" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"avg_grade": {

"avg": {

"field": "grade"

}

}

}

}

参数:search_type=count 表示只返回aggregation部分的结果。

2>Cardinality Aggregation  #计算出字段的唯一值。相当于sql中的distinct

{ "aggs" : { "author_count" : { "cardinality" : { "field" : "author" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"author_count": {

"cardinality": {

"field": "author"

}

}

}

}

3>Extended Stats Aggregation #字段的其他属性,包括最大最小,方差等等。

{ "aggs" : { "grades_stats" : { "extended_stats" : { "field" : "grade" } } } }

例子:GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"grades_stats": {

"extended_stats": {

"field": "grade"

}

}

}

}

返回值:

{ ... "aggregations": { "grade_stats": { "count": 9, "min": 72, "max": 99, "avg": 86, "sum": 774, "sum_of_squares": 67028, "variance": 51.55555555555556, "std_deviation": 7.180219742846005, "std_deviation_bounds": { "upper": 100.36043948569201, "lower": 71.63956051430799 } } } }

4>Geo Bounds Aggregation #计算出所有的地理坐标将会落在一个矩形区域。比如说朝阳区域有很多饭店,我就可以用一个矩形把这些饭店都圈起来,看看范围。

{ "query" : { "match" : { "business_type" : "shop" } }, "aggs" : { "viewport" : { "geo_bounds" : { "field" : "location", "wrap_longitude" : true } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"viewport": {

"geo_bounds": {

"field": "location",

"wrap_longitude": true

}

}

}

}

返回值:

{ ... "aggregations": { "viewport": { "bounds": { "top_left": { "lat": 80.45, "lon": -160.22 }, "bottom_right": { "lat": 40.65, "lon": 42.57 } } } } }

注释:这个矩形区域左上角坐标,和右下角坐标已经给出。也就是说你查出来的数据将会都落在这个地理范围内。

5>Geo Centroid Aggregation   #计算出所有文档的大概的中心点。比如说某个地区盗窃犯罪很多,那我这样就可以看到这片区域到底哪个点(街道)偷盗事件最猖狂。

{ "query" : { "match" : { "crime" : "burglary" } }, "aggs" : { "centroid" : { "geo_centroid" : { "field" : "location" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"centroid": {

"geo_centroid": {

"field": "location"

}

}

}

}

6>Max Aggregation  #求最大值

{ "aggs" : { "max_price" : { "max" : { "field" : "price" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"max_price": {

"max": {

"field": "price"

}

}

}

}

7>Min Aggregation #求最小值

{ "aggs" : { "min_price" : { "min" : { "field" : "price" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"min_price": {

"min": {

"field": "price"

}

}

}

}

8>Percentiles Aggregation #百分比统计。可以看出你网站的所有页面。加载时间的差异。

{ "aggs" : { "load_time_outlier" : { "percentiles" : { "field" : "load_time" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"load_time_outlier": {

"percentiles": {

"field": "load_time"

}

}

}

}

返回:可以看出这个网站75%页面在29毫秒左右就加载完毕了。有5%的页面超过了60毫秒。

{ ... "aggregations": { "load_time_outlier": { "values" : { "1.0": 15, "5.0": 20, "25.0": 23, "50.0": 25, "75.0": 29, "95.0": 60, "99.0": 150 } } } }

9>Percentile Ranks Aggregation #看看15毫秒和30毫秒内大概有多少页面加载完。

{ "aggs" : { "load_time_outlier" : { "percentile_ranks" : { "field" : "load_time", "values" : [15, 30] } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"load_time_outlier": {

"percentile_ranks": {

"field": "load_time",

"values": [

15,

30

]

}

}

}

}

返回:看出15毫秒时大概92%页面加载完毕。30毫秒时基本都加载完成。

{ ... "aggregations": { "load_time_outlier": { "values" : { "15": 92, "30": 100 } } } }

10>Stats Aggregation  #最大、最小、和、平均值。一起求出来

{ "aggs" : { "grades_stats" : { "stats" : { "field" : "grade" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"grades_stats": {

"stats": {

"field": "grade"

}

}

}

}

11>Sum Aggregation #求和

"aggs" : { "intraday_return" : { "sum" : { "field" : "change" } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"intraday_return": {

"sum": {

"field": "change"

}

}

}

}

12>Top hits Aggregation  #较为常用的统计。获取到每组前n条数据。相当于sql 中 group by 后取出前n条。

{ "aggs": { "top-tags": { "terms": { "field": "tags", "size": 3 }, "aggs": { "top_tag_hits": { "top_hits": { "sort": [ { "last_activity_date": { "order": "desc" } } ], "_source": { "include": [ "title" ] }, "size" : 1 } } } } } }

例子:取100组,每组只要第一条。为了见bain没用order和_source,请自行测试他们。

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"all_interests": {

"terms": {

"field": "zxw_id",

"size": 100

},

"aggs": {

"top_tag_hits": {

"top_hits": {

"size": 1

}

}

}

}

}

}

14>Value Count Aggregation  #数量统计,看看这个字段一共有多少个不一样的数值。

{ "aggs" : { "grades_count" : { "value_count" : { "field" : "grade" } } } }

例子:

GET index/type/_search?search_type=count

{

"query": {

"match_all": {}

},

"aggs": {

"grades_count": {

"value_count": {

"field": "grade"

}

}

}

}

2、Bucket Aggregations 这是第二种类型的统计(用的也是最多的,最实用的。)。后续也是抄写,各位自己看吧。有问题需要讨论的=》1250134974@qq.com发邮件.

网站:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-aggregations-bucket-children-aggregation.html

3、Pipeline Aggregations #这是第三中类型的聚合。

参考:Elasticsearch聚合——aggregation

参考:Elasticsearch--Aggregation详细总结(聚合统计)

参考:ElasticSearch聚合

ElasticSearch+聚合+Aggregation+示例相关推荐

  1. 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...

    在上一篇文章中,我们介绍了<大数据搜索与可视化分析(8)kibana入门教程-2-Discover>,本文学习elasticsearch聚合分析,是对<大数据搜索与可视化分析(3)e ...

  2. php聚合查询,php elasticsearch 聚合查询(Aggregation)

    Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景. 这里主要介绍PHP Elasticsearch 聚合查询的写法,如果不 ...

  3. 【Elasticsearch】Elasticsearch:aggregation介绍

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载.有问题可以先私聊我,本人每天都在线,会帮助需要的人. 文章目录 1.概述 2.关于Elastic Face ...

  4. Composite 聚合——Elasticsearch 聚合后分页新实现

    1.聚合后分页应用场景 在常规检索的基础上,用户期望返回基于特定字段的聚合结果,且用户期望分页查看检索和聚合结果. 如下图所示:以2020东京奥运会热点新闻亚洲飞人"苏炳添"为例, ...

  5. SpringCloud(9)— Elasticsearch聚合和自动补全

    SpringCloud(9)- Elasticsearch聚合和自动补全 一 数据聚合 1.聚合的分类 聚合(aggregations)可以实现对文档数据的统计,分析,运算.常见的聚合有三种: 1.桶 ...

  6. Elasticsearch:aggregation 介绍

    聚合 (aggregation) 功能集是整个 Elasticsearch 产品中最令人兴奋和有益的功能之一,主要是因为它提供了一个非常有吸引力对之前的 facets 的替代. 在本教程中,我们将解释 ...

  7. Elasticsearch聚合查询多字段设置权重

    Elasticsearch聚合查询多字段设置权重 背景 环境说明 script设置权重 小结 背景 实际应用中,可能会需要为为doc文档中某个字段的某些特定的值设置权重,影响排序.es提供了比较灵活的 ...

  8. Elasticsearch聚合分析Java Client

    本文基于Elasticsearch7.x 本文将上篇Elasticsearch聚合分析Rest API里的实例转化为Java Client Bucket Aggregation Bucket Aggr ...

  9. Elasticsearch:Aggregation 简介

    Aggregation 在中文中也被称作聚合.简单地说,Elasticsearch 中的 aggregation 聚合将你的数据汇总为指标.统计数据或其他分析.聚合可帮助你回答以下问题: 我的网站的平 ...

最新文章

  1. jQuery 技术揭秘
  2. Asp.Net编码模型
  3. 第四回 基类中的修饰符,应该根据你对架构的理解去定义它们,没有绝对的
  4. 关于Python编程的一些问答
  5. 年仅59岁!又一国家杰青不幸逝世
  6. 匿名内部类使用外部变量为什么必须是final修饰的
  7. Mac苹果电脑怎么快速切换应用?
  8. rocketdock皮肤_使用RocketDock皮肤获取Windows 7,Vista和XP中的Windows 8魅力栏
  9. 互联网巨头“赢家通吃”,会产生哪些严重后果?
  10. 小程序性能优化——文件的本地存储10M优化算法
  11. SESSION的窃取
  12. java的 violate 和 synchronize
  13. SQL Server 配置管理器中Browser灰色无法启动解决办法
  14. js读取excel导出json文件
  15. IP数据报在各层的信息格式
  16. R语言机器学习实战之多项式回归
  17. JAVA_eclipse插件绘制GUI界面过程
  18. 关于p标签不换行的问题
  19. 机器学习:模型评估与sklearn实现(三)_留一法与自助法(booststrapping)
  20. 拂去课本与心灵中的一缕灰尘

热门文章

  1. qq无限时间撤回消息bug_手机QQ新功能汇总,比微信有意思多了
  2. 服务器信号为970101,cDIN_EN_ISO_306.970101精选.pdf
  3. 超详细解读ORB-SLAM3 单目初始化过程(上篇)
  4. jquery-autoComplete 插件使用
  5. React Button 使用onClick 定义 antd 登录页面
  6. Drug Target Review | 筛选用于抗COVID-19的抗病毒化合物
  7. RDKit | 基于分子形状的比对
  8. eve战巡族伤害_新版本各族3级战巡资料【纯手打】
  9. 自定义 coding.net 静态网站域名
  10. 包邮免费送2022年科研人专属趣味台历,微科盟年终福利,错过悔一年!