Bucket & Metric Aggregation

Metric - ?些系列的統(tǒng)計(jì)?法
Bucket - ?組滿?條件的?檔
Aggregation 的語(yǔ)法
- Aggregation 屬于Search的一部分。一般情況下,建議將其 Size 指定為0

?個(gè)例?:?資統(tǒng)計(jì)信息
# 多個(gè) Metric 聚合,找到最低最高和平均工資
POST employees/_search
{
"size": 0,
"aggs": {
"max_salary": {
"max": {
"field": "salary"
}
},
"min_salary": {
"min": {
"field": "salary"
}
},
"avg_salary": {
"avg": {
"field": "salary"
}
}
}
}
res:
{
"took" : 64,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 20,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"max_salary" : {
"value" : 50000.0
},
"avg_salary" : {
"value" : 24700.0
},
"min_salary" : {
"value" : 9000.0
}
}
}
Metric Aggregation
-
單值分析:只輸出?個(gè)分析結(jié)果
min, max, avg, sum
Cardinality (類似 distinct Count)
-
多值分析:輸出多個(gè)分析結(jié)果
stats, extended stats
percentile, percentile rank
top hits (排在前?的示例)
Metric 聚合的具體 Demo
查看最低?資
查看最??資
?個(gè)聚合輸出多個(gè)值
-
?次查詢包含多個(gè)聚合
- 同時(shí)查看最低,最?和平均?資
Bucket

-
按照?定的規(guī)則,將?檔分配到不同的 桶中,從?達(dá)到分類的?的。ES 提供的 ?些常?的 Bucket Aggregation
Terms
數(shù)字類型
Range / Data Range
Histogram / Date Histogram
?持嵌套:也就在桶?再做分桶
Terms Aggregation
-
字段需要打開(kāi) fielddata,才能進(jìn)? Terms Aggregation
Keyword 默認(rèn)?持 doc_values
Text 需要在 Mapping 中 enable。會(huì)按照分詞后的結(jié)果進(jìn)?分
-
Demo
對(duì) job 和 job.keyword 進(jìn)?聚合
對(duì)性別進(jìn)? Terms 聚合
指定 bucket size
Cardinality
- 類似 SQL 中的 Distinct
POST employees/_search
{
"size": 0,
"aggs": {
"cardinate": {
"cardinality": {
"field": "job.keyword"
}
}
}
}
res:
{
"took" : 133,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 20,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"cardinate" : {
"value" : 7
}
}
}
Bucket Size & Top Hits Demo
應(yīng)?場(chǎng)景:當(dāng)獲取分桶后,桶內(nèi)最匹配的頂部?檔列表
Size:按年齡分桶,找出指定數(shù)據(jù)量的分桶信息
Top Hits:查看各個(gè)?種中,年紀(jì)最?的 3 名員?
優(yōu)化 Terms 聚合的性能

Range & Histogram 聚合
按照數(shù)字的范圍,進(jìn)?分桶
在 Range Aggregation 中,可以?定義 Key
-
Demo:
按照?資的 Range 分桶
按照?資的間隔(Histogram)分桶
Bucket + Metric Aggregation
-
Bucket 聚合分析允許通過(guò)添加?聚合分析來(lái)進(jìn)?步分析,?聚合分析可以是
Bucket
Metric
-
Demo
按照?作類型進(jìn)?分桶,并統(tǒng)計(jì)?資信息
先按照?作類型分桶,然后按性別分桶,并統(tǒng)計(jì)?資信息
本節(jié)知識(shí)點(diǎn)
-
聚合分析的具體語(yǔ)法
- ?個(gè)聚合查詢中可以包含多個(gè)聚合; 每個(gè) Bucket 聚合可以包含?聚合
-
Metrix
- 單值輸出 & 多值輸出
-
Bucket
- Terms & 數(shù)字范圍
demos
DELETE /employees
PUT /employees/
{
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"gender" : {
"type" : "keyword"
},
"job" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 50
}
}
},
"name" : {
"type" : "keyword"
},
"salary" : {
"type" : "integer"
}
}
}
}
PUT /employees/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "Emma","age":32,"job":"Product Manager","gender":"female","salary":35000 }
{ "index" : { "_id" : "2" } }
{ "name" : "Underwood","age":41,"job":"Dev Manager","gender":"male","salary": 50000}
{ "index" : { "_id" : "3" } }
{ "name" : "Tran","age":25,"job":"Web Designer","gender":"male","salary":18000 }
{ "index" : { "_id" : "4" } }
{ "name" : "Rivera","age":26,"job":"Web Designer","gender":"female","salary": 22000}
{ "index" : { "_id" : "5" } }
{ "name" : "Rose","age":25,"job":"QA","gender":"female","salary":18000 }
{ "index" : { "_id" : "6" } }
{ "name" : "Lucy","age":31,"job":"QA","gender":"female","salary": 25000}
{ "index" : { "_id" : "7" } }
{ "name" : "Byrd","age":27,"job":"QA","gender":"male","salary":20000 }
{ "index" : { "_id" : "8" } }
{ "name" : "Foster","age":27,"job":"Java Programmer","gender":"male","salary": 20000}
{ "index" : { "_id" : "9" } }
{ "name" : "Gregory","age":32,"job":"Java Programmer","gender":"male","salary":22000 }
{ "index" : { "_id" : "10" } }
{ "name" : "Bryant","age":20,"job":"Java Programmer","gender":"male","salary": 9000}
{ "index" : { "_id" : "11" } }
{ "name" : "Jenny","age":36,"job":"Java Programmer","gender":"female","salary":38000 }
{ "index" : { "_id" : "12" } }
{ "name" : "Mcdonald","age":31,"job":"Java Programmer","gender":"male","salary": 32000}
{ "index" : { "_id" : "13" } }
{ "name" : "Jonthna","age":30,"job":"Java Programmer","gender":"female","salary":30000 }
{ "index" : { "_id" : "14" } }
{ "name" : "Marshall","age":32,"job":"Javascript Programmer","gender":"male","salary": 25000}
{ "index" : { "_id" : "15" } }
{ "name" : "King","age":33,"job":"Java Programmer","gender":"male","salary":28000 }
{ "index" : { "_id" : "16" } }
{ "name" : "Mccarthy","age":21,"job":"Javascript Programmer","gender":"male","salary": 16000}
{ "index" : { "_id" : "17" } }
{ "name" : "Goodwin","age":25,"job":"Javascript Programmer","gender":"male","salary": 16000}
{ "index" : { "_id" : "18" } }
{ "name" : "Catherine","age":29,"job":"Javascript Programmer","gender":"female","salary": 20000}
{ "index" : { "_id" : "19" } }
{ "name" : "Boone","age":30,"job":"DBA","gender":"male","salary": 30000}
{ "index" : { "_id" : "20" } }
{ "name" : "Kathy","age":29,"job":"DBA","gender":"female","salary": 20000}
# Metric 聚合,找到最低的工資
POST employees/_search
{
"size": 0,
"aggs": {
"min_salary": {
"min": {
"field":"salary"
}
}
}
}
# Metric 聚合,找到最高的工資
POST employees/_search
{
"size": 0,
"aggs": {
"max_salary": {
"max": {
"field":"salary"
}
}
}
}
# 多個(gè) Metric 聚合,找到最低最高和平均工資
POST employees/_search
{
"size": 0,
"aggs": {
"max_salary": {
"max": {
"field": "salary"
}
},
"min_salary": {
"min": {
"field": "salary"
}
},
"avg_salary": {
"avg": {
"field": "salary"
}
}
}
}
# 一個(gè)聚合,輸出多值
POST employees/_search
{
"size": 0,
"aggs": {
"stats_salary": {
"stats": {
"field":"salary"
}
}
}
}
# 對(duì)keword 進(jìn)行聚合
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword"
}
}
}
}
# 對(duì) Text 字段進(jìn)行 terms 聚合查詢,失敗
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job"
}
}
}
}
# 對(duì) Text 字段打開(kāi) fielddata,支持terms aggregation
PUT employees/_mapping
{
"properties" : {
"job":{
"type": "text",
"fielddata": true
}
}
}
# 對(duì) Text 字段進(jìn)行 terms 分詞。分詞后的terms
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job"
}
}
}
}
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword"
}
}
}
}
# 對(duì)job.keyword 和 job 進(jìn)行 terms 聚合,分桶的總數(shù)并不一樣
POST employees/_search
{
"size": 0,
"aggs": {
"cardinate": {
"cardinality": {
"field": "job"
}
}
}
}
# 對(duì) 性別的 keyword 進(jìn)行聚合
POST employees/_search
{
"size": 0,
"aggs": {
"gender": {
"terms": {
"field":"gender"
}
}
}
}
#指定 bucket 的 size
POST employees/_search
{
"size": 0,
"aggs": {
"ages_5": {
"terms": {
"field":"age",
"size":3
}
}
}
}
# 指定size,不同工種中,年紀(jì)最大的3個(gè)員工的具體信息
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword"
},
"aggs":{
"old_employee":{
"top_hits":{
"size":3,
"sort":[
{
"age":{
"order":"desc"
}
}
]
}
}
}
}
}
}
#Salary Ranges 分桶,可以自己定義 key
POST employees/_search
{
"size": 0,
"aggs": {
"salary_range": {
"range": {
"field":"salary",
"ranges":[
{
"to":10000
},
{
"from":10000,
"to":20000
},
{
"key":">20000",
"from":20000
}
]
}
}
}
}
#Salary Histogram,工資0到10萬(wàn),以 5000一個(gè)區(qū)間進(jìn)行分桶
POST employees/_search
{
"size": 0,
"aggs": {
"salary_histrogram": {
"histogram": {
"field":"salary",
"interval":5000,
"extended_bounds":{
"min":0,
"max":100000
}
}
}
}
}
# 嵌套聚合1,按照工作類型分桶,并統(tǒng)計(jì)工資信息
POST employees/_search
{
"size": 0,
"aggs": {
"Job_salary_stats": {
"terms": {
"field": "job.keyword"
},
"aggs": {
"salary": {
"stats": {
"field": "salary"
}
}
}
}
}
}
# 多次嵌套。根據(jù)工作類型分桶,然后按照性別分桶,計(jì)算工資的統(tǒng)計(jì)信息
POST employees/_search
{
"size": 0,
"aggs": {
"Job_gender_stats": {
"terms": {
"field": "job.keyword"
},
"aggs": {
"gender_stats": {
"terms": {
"field": "gender"
},
"aggs": {
"salary_stats": {
"stats": {
"field": "salary"
}
}
}
}
}
}
}
}
相關(guān)閱讀