我正在尝试在过滤器聚合块中过滤空桶,并且从elasticsearch收到错误。没有这个,响应将是巨大的,因为我正在查询大量指标和嵌套聚合(为简单起见,这是较大查询的一部分)
GET index/type/_search?ignore_unavailable { "size": 0, "aggs": { "groupby_country": { "terms": { "field": "country", "size": 2000 }, "aggs": { "exists__x__filter": { "filter": { "bool": { "filter": [ { "exists": { "field": "x" } } ] } }, "aggs": { "sum": { "sum": { "script": "def val = doc['x'].value; if(val>0) Math.min(val , 20000)" } }, "average_distinct": { "bucket_script": { "buckets_path": { "count": "_count" }, "script": "return params.count " } } } } } } } }
弹性反应:
{ "error": { "root_cause": [], "type": "reduce_search_phase_exception", "reason": "[reduce] ", "phase": "fetch", "grouped": true, "failed_shards": [], "caused_by": { "type": "class_cast_exception", "reason": "org.elasticsearch.search.aggregations.bucket.filter.InternalFilter cannot be cast to org.elasticsearch.search.aggregations.InternalMultiBucketAggregation" } }, "status": 503 }
我想做的是:如果对于给定的国家/地区存储区,则没有字段x(例如,国家UK-2个文档没有“ x”字段),请勿将国家/地区存储区返回给客户。
bucket_selector为此,您需要一个脚本,而脚本则在较高级别上稍有不同:
bucket_selector
{ "size": 0, "aggs": { "groupby_country": { "terms": { "field": "country", "size": 2000 }, "aggs": { "exists__x__filter": { "filter": { "bool": { "filter": [ { "exists": { "field": "x" } } ] } }, "aggs": { "sum": { "sum": { "script": "def val = doc['x'].value; if(val>0) Math.min(val , 20000)" } } } }, "average_distinct": { "bucket_selector": { "buckets_path": { "count": "exists__x__filter._count" }, "script": "params.count > 0" } } } } } }