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"
                      }
                    }
                  }
                }
              }
            }
          }
        }'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM