Elastic Search聚合之bucket script

在前文Elastic Search 聚合筆記中已經介紹了Elastic Search聚合的基本用法,但這些常規的統計有的時候會不夠用,Elastic Search提供了很多其它的聚合方式來補充,本文這裏就介紹下其中很是靈活實用的bucket script的基本用法。html

例如,咱們在進行統計分析的時候,除了統計數量外,每每還會要求統計出知足某條件的數量佔總數的比例,須要通過以下三個步驟。java

  1. 求出當前文檔數量
  2. 求出知足條件的文檔的數量
  3. 計算兩個數量的百分比

前兩個數據還比較好說,只須要加一個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_path:指定相關上下文變量的查詢路徑,至關於定義變量和變量查詢路徑。其語法規則可參看 bucket_path語法規則,並不複雜,通常狀況下也能猜出個大體。
  • script: 腳本內容,支持好幾種語法,默認的相似java,具體可參看官方文檔: Scripting

有了上述基礎後,就能夠構建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" },
    //... ...
  }}

相關文章
相關標籤/搜索