Elasticsearch でつまづいた話 (5)

Bucket Selector Aggregation というのがある。Terms Aggregation を柔軟にしたようなもので、「あるフィールドで特定の条件を満たすレコードの単位で集計」というような記述ができる。

下の例では 2 つのフィールドをまたがって条件を指定している。  

{
  "bucket_selector": {
    "buckets_path": {
      "my_var1": "the_sum", 
      "my_var2": "the_value_count"
    },
    "script": "params.my_var1 > params.my_var2"
  }
}

これを Nested Aggregation 等と組み合わせて使用したい場合、フィールド名の指定が素直にいかない。 Nested の外から Nested 以下のフィールドを指定しようとすると > を使ってたどる必要がある。

{
  "aggs" : {
    "nested_agg" : {
      "nested" : {
        "path" : "product"
      },
      "aggs" : {
        "sum_values" : {
          "sum" : {
            "field" : "price"
          }
        }
      }
    },
    "bucket_agg" : {
      "bucket_selector" : {
        "bucket_path" : {
          "var" : "nested_agg>price"
        },
        "script" : {
          "var > 100"
        }
      }
    }
  }
}

この > でフィールドをたどるのはおそらく bucket_selector に限った話ではないと思うが、調べてもなかなか情報に当たらなかったので結構なハマりポイントだと思う。