搜尋引擎(Elasticsearch聚合分析)
阿新 • • 發佈:2019-04-01
學習目標
掌握聚合分析的查詢語法。
掌握指標聚合、桶聚合的用法
聚合分析簡介
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" } }
}
}