在前文Elastic Search 聚合筆記中已經介紹了Elastic Search聚合的基本用法,但這些常規的統計有的時候會不夠用,Elastic Search提供了很多其它的聚合方式來補充,本文這裏就介紹下其中很是靈活實用的bucket script的基本用法。html
例如,咱們在進行統計分析的時候,除了統計數量外,每每還會要求統計出知足某條件的數量佔總數的比例,須要通過以下三個步驟。java
前兩個數據還比較好說,只須要加一個filter bucket便可,例如,咱們想求出某bucket下的全部男性數量:elasticsearch
"aggs": {
"男性": {
"filter": { "term": { "性別": "男" } }
} ide
返回值爲 ui
{
"key": "true",
"doc_count": 497,
"男性": { "doc_count": 208 },
"男性比例": { "value": 41.0 }
} spa
可看到,自己就返回了每一個聚合的數量。難點在第3步,須要在前面兩步的基礎上再進行運算,這個就是比較典型的管道聚合了,因爲咱們當前只是一個簡單的運算,使用bucket script注入一些腳本的功能是很容易實現的,它的基本格式以下:htm
{
"bucket_script": {
"buckets_path": {
"my_var1": "the_sum",
"my_var2": "the_value_count"
},
"script": "params.my_var1 / params.my_var2"
}
} blog
主要有兩個參數 ip
有了上述基礎後,就能夠構建bucket script了,本文示例以下 ci
"aggs": {
"男性": {
"filter": { "term": { "性別": "男" } }
},
"男性比例": {
"bucket_script": {
"buckets_path": {
"p1": "男性._count",
"p2": "_count"
},
"script": "(int)(100 * params.p1 / params.p2)"
}
}
}
這裏用了"_count"這個特殊的路徑,它表明文檔的數量,這個在官方文檔中也有介紹:special path。
而後,咱們就獲得想要的結果了。
{
"key": "true",
"doc_count": 497,
"男性": { "doc_count": 208 },
"男性比例": { "value": 41.0 }
}
自己仍是比較簡單的,不過這個有個限制,那就是不能用在頂層聚合中,不然報錯。若是沒有上級聚合,能夠用一些規避的方式,例如,構造一個到全部數據的聚合做爲頂層聚合。
"aggs": {
"top": {
"terms": { "script": "true" },
//... ...
}}