• ElasticSearch-查询语法(聚合查询)


    ElasticSearch-查询语法(聚合查询)

    聚合查询

    聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。

    最大值

    GET student/_search
    {
        "aggs": {
            "max_age": {
                "max": {
                    "field": "age"
                }
            }
        },
        "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    解释上面的语法:

    • aggs 是 aggregations缩写 表示聚合的意思
    • max_age 是聚合的名称(任意),到时候结果会放入此名称下
    • max 聚合的类型,这里使用max取最大值

    最小值

    GET student/_search
    {
        "aggs": {
            "min_age": {
                "min": {
                    "field": "age"
                }
            }
        },
        "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    求和

    GET student/_search
    {
        "aggs": {
            "sum_age": {
                "sum": {
                    "field": "age"
                }
            }
        },
        "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    平均值

    GET student/_search
    {
        "aggs": {
            "avg_age": {
                "avg": {
                    "field": "age"
                }
            }
        },
        "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Stats 5 个指标(count、max、min、avg 和 sum )

    Stats Aggregation 用于基本统计,会一次返回 count、max、min、avg 和 sum 这 5 个指标。例如,在 exams 索引中对 grade 字段进行分数相关的基本统计,查询语句如下:

    
    GET /exams/_search?size=0
    {
      "aggs" : {
        "grades_stats" : { 
          "stats" : { "field" : "grade" } 
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果:

    {
      "aggregations": {
        "grades_stats": {
          "count": 2,
          "min": 50.0,
          "max": 100.0,
          "avg": 75.0,
          "sum": 150.0
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Extended Stats(平方,方差,标准差…)

    Extended Stats Aggregation 用于高级统计,和基本统计功能类似,但是会比基本统计多出以下几个统计结果,sum_of_squares(平方和)、variance(方差)、std_deviation(标准差)、std_deviation_bounds(平均值加/减两个标准差的区间)。在 exams 索引中对 grade 字段进行分数相关的高级统计,查询语句如下:

    GET /exams/_search?size=0
    {
      "aggs" : {
        "grades_stats" : { 
          "extended_stats" : { "field" : "grade" } 
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    聚合结果如下:

    {
      ...
      "aggregations": {
        "grades_stats": {
          "count": 2,
          "min": 50.0,
          "max": 100.0,
          "avg": 75.0,
          "sum": 150.0,
          "sum_of_squares": 12500.0,
          "variance": 625.0,
          "std_deviation": 25.0,
          "std_deviation_bounds": {
            "upper": 125.0,
            "lower": 25.0
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    去重后返回结果的个数

    等同数据库SELECT COUNT(DISTINCT(user_id)) FROM table WHERE user_id_type = 3;

    GET student/_search
    {
    
      "query": {
        "term": {
          "user_id_type": 3
        }
      },
      "aggs": {
        "count": {
          "cardinality": {
            "field": "user_id"
          }
        },
        "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    查询根据指定字段去重显示

    等同于数据库SELECT DISTINCT(user_id) FROM table WHERE user_id_type = 3;

    GET student/_search
    {
      "query": {
        "term": {
          "user_id_type": 3
        }
      },
      "collapse": {
        "field": "user_id"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Percentiles(百分位统计)

    Percentiles Aggregation 用于百分位统计。百分位数是一个统计学术语,如果将一组数据从大到小排序,并计算相应的累计百分位,某一百分位所对应数据的值就称为这一百分位的百分位数。默认情况下,累计百分位为 [ 1, 5, 25, 50, 75, 95, 99 ]。以下例子给出了在 latency 索引中对 load_time 字段进行加载时间的百分位统计,查询语句如下:

    GET latency/_search
    {
      "size": 0,
      "aggs" : {
        "load_time_outlier" : {
          "percentiles" : {
            "field" : "load_time" 
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    需要注意的是,如上的 load_time 字段必须是数字类型

    聚合结果如下:

    {
      ...
      "aggregations": {
        "load_time_outlier": {
          "values" : {
            "1.0": 5.0,
            "5.0": 25.0,
            "25.0": 165.0,
            "50.0": 445.0,
            "75.0": 725.0,
            "95.0": 945.0,
            "99.0": 985.0
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    百分位的统计也可以指定 percents 参数指定百分位,如下:

    Percentiles Ranks(百分位统计)

    Percentiles Ranks Aggregation 与 Percentiles Aggregation 统计恰恰相反,就是想看当前数值处在什么范围内(百分位), 假如你查一下当前值 500 和 600 所处的百分位,发现是 90.01 和 100,那么说明有 90.01 % 的数值都在 500 以内,100 % 的数值在 600 以内。

    GET latency/_search
    {
      "size": 0,
        "aggs" : {
          "load_time_ranks" : {
            "percentile_ranks" : {
              "field" : "load_time", 
              "values" : [500, 600]
            }
          }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    同样 load_time 字段必须是数字类型

    返回结果大概类似如下:

    {
      ...
      "aggregations": {
        "load_time_ranks": {
          "values" : {
            "500.0": 90.01,
            "600.0": 100.0
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    桶聚合

    bucket 可以理解为一个桶,它会遍历文档中的内容,凡是符合某一要求的就放入一个桶中,分桶相当于 SQL 中的 group by。从另外一个角度,可以将指标聚合看成单桶聚合,即把所有文档放到一个桶中,而桶聚合是多桶型聚合,它根据相应的条件进行分组。

    种类描述/场景
    词项聚合(Terms Aggregation)用于分组聚合,让用户得知文档中每个词项的频率,它返回每个词项出现的次数。
    差异词项聚合(Significant Terms Aggregation)它会返回某个词项在整个索引中和在查询结果中的词频差异,这有助于我们发现搜索场景中有意义的词。
    过滤器聚合(Filter Aggregation)指定过滤器匹配的所有文档到单个桶(bucket),通常这将用于将当前聚合上下文缩小到一组特定的文档。
    多过滤器聚合(Filters Aggregation)指定多个过滤器匹配所有文档到多个桶(bucket)。
    范围聚合(Range Aggregation)范围聚合,用于反映数据的分布情况。
    日期范围聚合(Date Range Aggregation)专门用于日期类型的范围聚合。
    IP 范围聚合(IP Range Aggregation)用于对 IP 类型数据范围聚合。
    直方图聚合(Histogram Aggregation)可能是数值,或者日期型,和范围聚集类似。
    时间直方图聚合(Date Histogram Aggregation)时间直方图聚合,常用于按照日期对文档进行统计并绘制条形图。
    空值聚合(Missing Aggregation)空值聚合,可以把文档集中所有缺失字段的文档分到一个桶中。
    地理点范围聚合(Geo Distance Aggregation)用于对地理点(geo point)做范围统计。

    Terms

    Terms Aggregation 用于词项的分组聚合。最为经典的用例是获取 X 中最频繁(top frequent)的项目,其中 X 是文档中的某个字段,如用户的名称、标签或分类。由于 terms 聚集统计的是每个词条,而不是整个字段值,因此通常需要在一个非分析型的字段上运行这种聚集。原因是, 你期望“big data”作为词组统计,而不是“big”单独统计一次,“data”再单独统计一次。

    用户可以使用 terms 聚集,从分析型字段(如内容)中抽取最为频繁的词条。还可以使用这种信息来生成一个单词云。

    {
      "aggs": {
        "profit_terms": {
          "terms": { // terms 聚合 关键字
            "field": "profit",
            ......
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在 terms 分桶的基础上,还可以对每个桶进行指标统计,也可以基于一些指标或字段值进行排序。示例如下:

    {
      "aggs": {
        "item_terms": {
          "terms": {
            "field": "item_id",
            "size": 1000,
            "order":[{
              "gmv_stat": "desc"
            },{
              "gmv_180d": "desc"
            }]
          },
          "aggs": {
            "gmv_stat": {
              "sum": {
                "field": "gmv"
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    Filter

    Filter Aggregation 是过滤器聚合,可以把符合过滤器中的条件的文档分到一个桶中,即是单分组聚合。

    {
      "aggs": {
        "age_terms": {
          "filter": {"match":{"gender":"F"}},
          "aggs": {
            "avg_age": {
              "avg": {
                "field": "age"
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Filters

    Filters Aggregation 是多过滤器聚合,可以把符合多个过滤条件的文档分到不同的桶中,即每个分组关联一个过滤条件,并收集所有满足自身过滤条件的文档。

    {
      "size": 0,
      "aggs": {
        "messages": {
          "filters": {
            "filters": {
              "errors": { "match": { "body": "error" } },
              "warnings": { "match": { "body": "warning" } }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这个例子里,我们分析日志信息。聚合会创建两个关于日志数据的分组,一个收集包含错误信息的文档,另一个收集包含告警信息的文档。而且每个分组会按月份划分。返回结果:

    {
      ...
      "aggregations": {
        "messages": {
          "buckets": {
            "errors": {
              "doc_count": 1
            },
            "warnings": {
              "doc_count": 2
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Range

    Range Aggregation 范围聚合是一个基于多组值来源的聚合,可以让用户定义一系列范围,每个范围代表一个分组。在聚合执行的过程中,从每个文档提取出来的值都会检查每个分组的范围,并且使相关的文档落入分组中。注意,范围聚合的每个范围内包含 from 值但是排除 to 值。

    {
      "aggs": {
        "age_range": {
          "range": {
            "field": "age",
              "ranges": [{
                "to": 25
              },
              {
                "from": 25,
                "to": 35
              },
              {
                "from": 35
              }]
            },
            "aggs": {
              "bmax": {
                "max": {
                  "field": "balance"
                }
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    返回结果如下:

    {
      ...
      "aggregations": {
        "age_range": {
          "buckets": [{
            "key": "*-25.0",
            "to": 25,
            "doc_count": 225,
            "bmax": {
              "value": 49587
            }
          },
          {
            "key": "25.0-35.0",
            "from": 25,
            "to": 35,
            "doc_count": 485,
            "bmax": {
              "value": 49795
            }
          },
          {
            "key": "35.0-*",
            "from": 35,
            "doc_count": 290,
            "bmax": {
              "value": 49989
            }
          }]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    点赞 -收藏-关注-便于以后复习和收到最新内容
    有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
    在本博客学习的技术不得以任何方式直接或者间接的从事违反中华人民共和国法律,内容仅供学习、交流与参考
    免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我、以迅速采取适当措施,避免给双方造成不必要的经济损失。
    感谢,配合,希望我的努力对你有帮助^_^
  • 相关阅读:
    服务器推送数据之SSE (server send event)
    文件上传功能实现
    Java性能优化可算是讲明白了,优化权威指南就是强
    Python Urllib:网络库(stdlib)的强大功能与灵活运用
    js加密进阶与搭建Node服务
    vue面试题
    detectron2环境搭建及自定义coco数据集(voc转coco)训练
    洞察商机,驱动创新:智能数据分析引领企业发展
    微信小程序开发中医药配方小程序药方后台管理系统|前后分离VUE.js
    [附源码]JAVA毕业设计高校学生社团管理(系统+LW)
  • 原文地址:https://blog.csdn.net/weixin_45203607/article/details/127753941