zoukankan      html  css  js  c++  java
  • 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"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }'
  • 相关阅读:
    调试JavaScript/VB Script脚本程序(ASP篇)
    成功接收来自Internet的邮件必须要做到的条件
    (转)Ext与.NET超完美整合 .NET开发者的超级优势
    如何防垃圾邮件用你的邮件服务器转发
    记录书籍名称
    GRE网站
    JAVA线程的缺陷
    【让这些电影给你“治病”】
    zoj题目分类
    Oracle to_char格式化函数
  • 原文地址:https://www.cnblogs.com/hcy-fly/p/7987112.html
Copyright © 2011-2022 走看看