首页 > 解决方案 > 如何在 bucket_script 中使用父级的兄弟存储桶路径?

问题描述

我想在存储桶脚本中使用父级的兄弟存储桶路径,DSL 如下:

{
  "size": 0, 
  "aggs": {
    "car_type": {
      "terms": {
        "field": "screenName",
        "size": 10
      },
      "aggs": {
        "active_num": {
          "terms": {
            "field": "activeNum",
            "size": 10
          },
          "aggs": {
            "active_count": {
              "value_count": {
                "field": "activeNum"
              }
            },
            "result" : {
              "bucket_script": {
                "buckets_path": {
                  "count1" : "car_type>all_count",
                  "count2" : "active_count"
            },
                "script": "params.count2/params.count1"
              }
            }
          }
        },
        "all_count": {
          "value_count": {
            "field": "activeNum"
          }
        }
      }
    }
  }
}

我想用all_countin result,但是 es 会抛出异常:

未找到路径 [car_type>all_count] 的聚合

然后,我改变了使用bucket_script的地方,像这样:

{
  "size": 0, 
  "aggs": {
    "car_type": {
      "terms": {
        "field": "screenName",
        "size": 10
      },
      "aggs": {
        "active_num": {
          "terms": {
            "field": "activeNum",
            "size": 10
          },
          "aggs": {
            "active_count": {
              "value_count": {
                "field": "activeNum"
              }
            }
          }
        },
        "all_count": {
          "value_count": {
            "field": "activeNum"
          }
        },
        "result" : {
          "bucket_script": {
             "buckets_path": {
                "count1" : "all_count",
                "count2" : "active_num>active_count"
              },
              "script": "params.count2/params.count1"
          }
        }
      }
    }
  }
}

但我得到另一个例外:

buckets_path 必须引用数字值或单值数字度量聚合,得到:java.lang.Object[]

我找到了官方网站页面,但我什么也没得到。我该如何使用这个 bucket_path?

标签: elasticsearchelasticsearch-dsl

解决方案


使用以下方法可以解决一些问题:

{
  "size": 0, 
  "aggs": {
    "car_type": {
      "terms": {
        "field": "screenName",
        "size": 10
      },
      "aggs": {
        "active_num": {
          "filter": {
            "term": {
            "activeNum": "1"
            }
          },
          "aggs": {
            "active_count": {
              "value_count": {
                "field": "activeNum"
              }
            }
          }
        },
        "all_count": {
          "value_count": {
            "field": "activeNum"
          }
        },
        "result" : {
          "bucket_script": {
             "buckets_path": {
                "count1" : "all_count",
                "count2" : "active_num>active_count"
              },
              "script": "params.count2/params.count1"
          }
        }
      }
    }
  }
}

但是还是有一些问题,这种方法只能得到一个值的结果,不能得到这个字段的每一个值。那么,谁还有其他想法?


推荐阅读