什么是聚合(Aggregation)
1、 elasticsearch 除了搜索以外,提供的针对ES数据进行统计分析的功能
实时性高、Hadoop(T+1)
2、通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档
3、高性能,只需要一套语句,就可以从Elasticsearch得到分析结果(无需在客户端自己去实现分析逻辑)
集合的分类
Aggregation共分为三种:Metric Aggregations、Bucket Aggregations、 Pipeline Aggregations、Matrix Aggregations。
Metric Aggregations 主要是做 一系列的统计,Bucket Aggregations相当于分组。
准备测试数据:
- PUT zhifou/_doc/1
- {
- "name":"顾老二",
- "age":30,
- "from": "gu",
- "desc": "皮肤黑、武器长、性格直",
- "tags": ["黑", "长", "直"]
- }
-
- PUT zhifou/_doc/2
- {
- "name":"大娘子",
- "age":18,
- "from":"sheng",
- "desc":"肤白貌美,娇憨可爱",
- "tags":["白", "富","美"]
- }
-
- PUT zhifou/_doc/3
- {
- "name":"龙套偏房",
- "age":22,
- "from":"gu",
- "desc":"mmp,没怎么看,不知道怎么形容",
- "tags":["造数据", "真","难"]
- }
-
-
- PUT zhifou/_doc/4
- {
- "name":"石头",
- "age":29,
- "from":"gu",
- "desc":"粗中有细,狐假虎威",
- "tags":["粗", "大","猛"]
- }
-
- PUT zhifou/_doc/5
- {
- "name":"魏行首",
- "age":25,
- "from":"广云台",
- "desc":"仿佛兮若轻云之蔽月,飘飘兮若流风之回雪,mmp,最后竟然没有嫁给顾老二!",
- "tags":["闭月","羞花"]
- }
Bucket Aggregations 的api 介绍
下面例子使用 term是 进行分桶
分组查询
现在我想要查询所有人的年龄段,并且按照15~20,20~25,25~30
分组,并且算出每组的平均年龄。
分析需求,首先我们应该先把分组做出来。
- GET zhifou/_search
- {
- "size": 0,
- "query": {
- "match_all": {}
- },
- "aggs": {
- "age_group": {
- "range": {
- "field": "age",
- "ranges": [
- {
- "from": 15,
- "to": 20
- },
- {
- "from": 20,
- "to": 25
- },
- {
- "from": 25,
- "to": 30
- }
- ]
- }
- }
- }
- }
Metric Aggregations 的api 介绍
1 Avg Aggregation #计算出字段平均值
做聚合分析,应该讲size 设置为0,否则会返回查询结果。写20,aggs的相关结果会出现在比较后面而已
现在的需求是查询from
是gu
的人的平均年龄。
- POST zhifou/_search
- {
- "size": 0,
- "query": {
- "match": {
- "from": "gu"
- }
- },
- "aggs": {
- "age_ave": {
- "avg": {
- "field": "age"
- }
- }
- }
- }
上例中,首先匹配查询from
是gu
的数据。在此基础上做查询平均值的操作,这里就用到了聚合函数,其语法被封装在aggs
中,而age_ave
则是为查询结果起个别名,封装了计算出的平均值。那么,要以什么属性作为条件呢?是age
年龄,查年龄的什么呢?是avg
,查平均年龄。
2 Max Aggregation #求最大值
- GET zhifou/_search
- {
- "aggs": {
- "my_max": {
- "max": {
- "field": "age"
- }
- }
- },
- "size": 0
- }
3 Min Aggregation #求最小值
- GET zhifou/_search
- {
- "aggs": {
- "my_min": {
- "min": {
- "field": "age"
- }
- }
- },
- "size": 0
- }
4 Sum Aggregation #求和
- "aggs" : {
- "intraday_return" : { "sum" : { "field" : "change" } }
- }
5 Stats Aggregation #最大、最小、和、平均值。一起求出来
- GET zhifou/_search
- {
- "aggs": {
- "my_stats": {
- "stats": {
- "field": "age"
- }
- }
- },
- "size": 0
- }
6 Extended Stats Aggregation #字段的其他属性,包括最大最小,方差等等。
- GET zhifou/_search
- {
- "aggs": {
- "my_extended_stats": {
- "extended_stats": {
- "field": "age"
- }
- }
- },
- "size": 0
- }
7 Cardinality Aggregation #计算出字段的唯一值。相当于sql中的distinct
- {
- "aggs" : {
- "author_count" : {
- "cardinality" : {
- "field" : "author"
- }
- }
- }
- }
8 Geo Bounds Aggregation
计算出所有的地理坐标将会落在一个矩形区域。比如说朝阳区域有很多饭店,我就可以用一个矩形把这些饭店都圈起来,看看范围。
- {
- "query" : {
- "match" : { "business_type" : "shop" }
- },
- "aggs" : {
- "viewport" : {
- "geo_bounds" : {
- "field" : "location",
- "wrap_longitude" : true
- }
- }
- }
- }
9 Geo Centroid Aggregation
计算出所有文档的大概的中心点。比如说某个地区盗窃犯罪很多,那我这样就可以看到这片区域到底哪个点(街道)偷盗事件最猖狂。
- {
- "query" : {
- "match" : { "crime" : "burglary" }
- },
- "aggs" : {
- "centroid" : {
- "geo_centroid" : {
- "field" : "location"
- }
- }
- }
- }
10 Percentiles Aggregation
百分比统计。可以看出你网站的所有页面。加载时间的差异
- {
- "aggs" : {
- "load_time_outlier" : {
- "percentiles" : {
- "field" : "load_time"
- }
- }
- }
- }
11 Percentile Ranks Aggregation
看看15毫秒和30毫秒内大概有多少页面加载完。
- {
- "aggs" : {
- "load_time_outlier" : {
- "percentile_ranks" : {
- "field" : "load_time",
- "values" : [15, 30]
- }
- }
- }
- }
12 Top hits Aggregation
- {
- "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
- }
- }
- }
- }
- }
- }
13 alue Count Aggregation #数量统计,看看这个字段一共有多少个不一样的数值。
- {
- "aggs" : {
- "grades_count" : { "value_count" : { "field" : "grade" } }
- }
- }
嵌套
在kabana导入 航空信息
- #查看航班目的地的统计信息,增加平均,最高最低价格
- GET kibana_sample_data_flights/_search
- {
- "size": 0,
- "aggs":{
- "flight_dest":{
- "terms":{
- "field":"DestCountry"
- },
- "aggs":{
- "avg_price":{
- "avg":{
- "field":"AvgTicketPrice"
- }
- },
- "max_price":{
- "max":{
- "field":"AvgTicketPrice"
- }
- },
- "min_price":{
- "min":{
- "field":"AvgTicketPrice"
- }
- }
- }
- }
- }
- }
-
- #价格统计信息+天气信息
- GET kibana_sample_data_flights/_search
- {
- "size": 0,
- "aggs":{
- "flight_dest":{
- "terms":{
- "field":"DestCountry"
- },
- "aggs":{
- "stats_price":{
- "stats":{
- "field":"AvgTicketPrice"
- }
- },
- "wather":{
- "terms": {
- "field": "DestWeather",
- "size": 5
- }
- }
-
- }
- }
- }
- }