• ElastaticSearch学习笔记(三) ----- 聚合查询


    聚合(Aggregation)概念

    1. Bucket Aggregation, 桶聚合,即将稳定按照特定列的值分到不同桶中

    2. Metric Aggregation, 度量聚合,对文档数据的聚合结果进行运算,类似SQL中的聚合函数(比如 max min avg 等)

    3. Pipeline Aggregation, 对聚合结果进行二次聚合

    4. Matrix Aggreagation,提供对多个字段聚合操作的支持

    桶聚合:

    • 按terms聚合(类似于分组group by):

    格式如下:

    聚合名称可以自己定义,建议用'_'线来分隔单词,比如test_terms。

    {
        "size" : 0,   
        "aggs" : {    
            "自已命名的聚合名称,比如test_terms" : {   
                "terms" : { 
                  "field" : "字段名称",
                  "size" : 10000,
                  "order" : {
                     "_term" : "asc"
                  }
                }
            }
        }
    }
    

    解释如下:

    size:第一个size,为0表示不需要返回文档,所以直接设置为0可以提高查询速度。
    
    aggs:aggs是aggregations的缩写,可以写全称也可以缩写。
    
    聚合名称:在aggs内部,需要自己定义一个聚合的名称,建议用'_'线来分隔单词。在返回的结果中也会用这个变量名来储存数值的。
    
    terms:定义单个桶(集合)的类型为 terms,按里面的field 字段进行分类,类似于sql中的group by 
    
    terms size: terms里面包含的size,默认为10,表示返回聚合查询结果的条数。。
    
    比如设置size为50,对指定的字段名称聚合分组求和后,就只会返回50条。这里的size最好不要设置为0。
    
    order: 排序。{ "_term" : "asc" }表示按照聚合的字段名称field进行升序排列。
    
    比如对指定的字段名称order_date聚合分组求和后,想按照order_date升序排列,就可以使用这种方式。
    
    { "_count" : "asc" }表示按照doc_count(文档数量)排序。默认是按照doc_count排序。
    
    
    

    返回结果,如下所示:

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 3,
        "successful": 3,
        "failed": 0
      },
      "hits": {
        "total": 19,
        "max_score": 0,
        "hits": []
      },
      "aggregations": {
        "自己命名的聚合名称": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": "14",
              "doc_count": 16
            },
            {
              "key": "10",
              "doc_count": 3
            }
          ]
        }
      }
    }
    

    解释如下:

      Buckets(桶/集合):满足特定条件的文档的集合。
    	
      hits: hits为空,因为设置了返回的文档数量(size)为0,所以在这个文档里面是不会包含具体的文档的。
      
      key:按照指定的字段分组后的字段内容。
      
      doc_count:各个分组的数量。
    

    度量聚合

    类似于分组统计。

    比如,分组求平均值avg,求最大max,最小min等。

    聚合名称1和2需要自己命名,同样会在返回结果中显示。

    {
       "size" : 0,
       "aggs": {
          "自己命名的聚合名称1": {
             "terms": {
                "field": "字段名称",
                "size" : 10000
             },
             "aggs": { 
                "自己命名的聚合名称2": { 
                   "avg": {
                      "field": "字段名称" 
                   }
                }
             }
          }
       }
    }
    

    返回结果如下:

      "aggregations": {
        "聚合名称1": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": "14",
              "doc_count": 16,
              "聚合名称2": {
                "value": 33156.1875			//这个value就是avg求得的平均值。
              }
            },
            {
              "key": "10",
              "doc_count": 3,
              "聚合名称2": {
                "value": 662962.3333333334
              }
            }
          ]
        }
    
    
    

    另外还有一个stas聚合,可以返回包括min,max,avg,sum,count等统计信息。

    {
     "size" : 0, 
     "aggs": {
        "自己命名的聚合名称1": {
          "terms": {
            "field": "字段名称1",
            "size": 10
          }, "aggs": {
              "自己命名的聚合名称2": {
                "stats": {
                  "field": "字段名称2"
              }
            }
          }
          
        }
      }
    }    
    

    返回的结果类似如下:

      "aggregations": {
        "dateGrup": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": "2020-10-10",
              "doc_count": 19739,
              "pick_num": {
                "count": 17346,
                "min": 1,
                "max": 36148,
                "avg": 55.61362850224836,
                "sum": 964674
              }
            }]
    
    

    参考资料:

    http://blog.itpub.net/29715045/viewspace-2653369/

    https://blog.csdn.net/qq_29580525/article/details/80908523

    https://www.cnblogs.com/ghj1976/p/5293250.html

  • 相关阅读:
    如何在JavaScript中正确引用某个方法(bind方法的应用)
    使用后缀数组寻找最长公共子字符串JavaScript版
    YprogressBar,html5进度条样式,js进度条插件
    java中基本类型和包装类型实践经验
    0~400中1出现了多少次?
    关于JavaScript内存泄漏的质疑
    maven本地仓库配置文件
    IntelliJ idea工具使用
    等额本息和等额本金计算
    开发软件合集
  • 原文地址:https://www.cnblogs.com/expiator/p/13843969.html
Copyright © 2020-2023  润新知