1. 程式人生 > >搜尋引擎(Elasticsearch聚合分析)

搜尋引擎(Elasticsearch聚合分析)

開發十年,就只剩下這套架構體系了! >>>   

學習目標

掌握聚合分析的查詢語法。
掌握指標聚合、桶聚合的用法

聚合分析簡介

ES聚合分析是什麼?

聚合分析是資料庫中重要的功能特性,完成對一個查詢的資料集中資料的聚合計算,如:找出某欄位(或計算表示式的結果)的最大值、最小值,計算和、平均值等。ES作為搜尋引擎兼資料庫,同樣提供了強大的聚合分析能力。

對一個數據集求最大、最小、和、平均值等指標的聚合,在ES中稱為指標聚合   metric
而關係型資料庫中除了有聚合函式外,還可以對查詢出的資料進行分組group by,再在組上進行指標聚合。在 ES 中group by 稱為分桶,桶聚合  bucketing

ES中還提供了矩陣聚合(matrix)、管道聚合(pipleline),但還在完善中。

ES聚合分析查詢的寫法

在查詢請求體中以aggregations節點按如下語法定義聚合分析:

"aggregations" : {
    "<aggregation_name>" : {         //aggregations 也可簡寫為 aggs
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

聚合分析的值來源

聚合計算的值可以取欄位的值,也可是指令碼計算的結果。

 

指標聚合

max  min  sum  avg

POST /bank/_search?
{
  "size": 0, 
  "aggs": {
    "masssbalance": {
      "max": {
        "field": "balance"
      }
    }
  }
}
查詢所有客戶中餘額的最大值
POST /bank/_search?
{
  "size": 2, 
  "query": {
    "match": {
      "age": 24
    }
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "max_balance": {
      "max": {
        "field": "balance"
      }
    }
  }
}
年齡為24歲的客戶中的餘額最大值
POST /bank/_search?size=0
{
    "aggs" : {                   //值來源於指令碼
        "avg_age" : {
            "avg" : {
                "script" : {    //查詢所有客戶的平均年齡是多少
                    "source" : "doc.age.value"
                }
            }
        },
        "avg_age10" : {
            "avg" : {
                "script" : {
                    "source" : "doc.age.value + 10"
                }
            }
        }
    }}
POST /bank/_search?size=0
{
  "aggs": {
    "sum_balance": {
      "sum": {
        "field": "balance",   //指定field,在指令碼中用_value 取欄位的值
        "script": {
            "source": "_value * 1.03"
        }
      }
    }
  }
}
POST /bank/_search?size=0
{
  "aggs": {
    "avg_age": {
      "avg": {
        "field": "age",
        "missing": 18
      }
    }  }}
POST /bank/_search?size=0
{
  "aggs": {
    "avg_age": {
      "avg": {
        "field": "age",    //為缺失值欄位,指定值。如未指定,缺失該欄位值的文件將被忽略。
        "missing": 18
      }
    }
  }
}

文件計數 count

POST /bank/_doc/_count
{
  "query": {
    "match": {
      "age" : 24
    }
  }
}

cardinality  值去重計數

POST /bank/_search?size=0
{
  "aggs": {
    "age_count": {
      "cardinality": {
        "field": "age"
      }
    },
    "state_count": {
      "cardinality": {
        "field": "state.keyword"
      }
    }
  }
}
state的使用它的keyword版

Value count 統計某欄位有值的文件數

POST /bank/_search?size=0
{
    "aggs" : {
        "age_count" : { "value_count" : { "field" : "age" } }
    }
}