实现类似HAVINg的行为
您可以使用一种
pipelineaggregations,即存储桶选择器聚合。查询如下所示:
POST my_index/tdrs/_search{ "aggregations": { "reseller_sale_sum": { "aggregations": { "sales": { "sum": { "field": "requestAmountValue" } }, "max_sales": { "bucket_selector": { "buckets_path": { "var1": "sales" }, "script": "params.var1 > 10000" } } }, "terms": { "field": "senderResellerId", "order": { "sales": "desc" }, "size": 5 } } }, "size": 0}将以下文档放入索引后:
"hits": [ { "_index": "my_index", "_type": "tdrs", "_id": "AV9Yh5F-dSw48Z0DWDys", "_score": 1, "_source": {"requestAmountValue": 7000,"senderResellerId": "ID_1" } }, { "_index": "my_index", "_type": "tdrs", "_id": "AV9Yh684dSw48Z0DWDyt", "_score": 1, "_source": {"requestAmountValue": 5000,"senderResellerId": "ID_1" } }, { "_index": "my_index", "_type": "tdrs", "_id": "AV9Yh8TBdSw48Z0DWDyu", "_score": 1, "_source": {"requestAmountValue": 1000,"senderResellerId": "ID_2" } } ]查询的结果是:
"aggregations": { "reseller_sale_sum": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "ID_1", "doc_count": 2, "sales": { "value": 12000 } } ] } }即仅那些
senderResellerId累计销售额为的者
>10000。
数桶
要实现等效功能,
SELECT COUNT(*) FROM (...HAVINg)可以结合使用桶脚本聚合和总和桶聚合。尽管似乎没有直接的方法来计算
bucket_selector实际选择了多少个存储桶,但我们可以定义一个
bucket_script产生
0或
1取决于条件的
sum_bucket产生它的
sum:
POST my_index/tdrs/_search{ "aggregations": { "reseller_sale_sum": { "aggregations": { "sales": { "sum": { "field": "requestAmountValue" } }, "max_sales": { "bucket_script": { "buckets_path": { "var1": "sales" }, "script": "if (params.var1 > 10000) { 1 } else { 0 }" } } }, "terms": { "field": "senderResellerId", "order": { "sales": "desc" } } }, "max_sales_stats": { "sum_bucket": { "buckets_path": "reseller_sale_sum>max_sales" } } }, "size": 0}输出将是:
"aggregations": { "reseller_sale_sum": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ ... ] }, "max_sales_stats": { "value": 1 } }所需的存储桶数位于中
max_sales_stats.value。
重要注意事项
我必须指出两件事:
- 该功能是实验性的(从ES 5.6开始,它仍是实验性的,尽管它是在2.0.0-beta1中添加的。)
- 管道聚合应用于先前的聚合结果:
管道聚合工作于其他聚合而不是文档集所产生的输出,从而将信息添加到输出树中。
这意味着
bucket_selector将在上的
terms聚合结果之后和之后应用聚合
senderResellerId。例如,如果聚合定义
senderResellerId不止
size一个
terms,则不会使用来获得集合中的
所有 id
sum(sales) > 10000,而只会获取出现在
terms聚合输出中的id
。考虑使用排序和/或设置足够的
size参数。
这也适用于第二种情况,
COUNT() (... HAVINg)该情况仅计算聚合输出中实际存在的那些存储桶。
如果此查询太重或存储桶数太大,请考虑对数据进行规范化或将此总和直接存储在文档中,以便可以使用普通
range查询来实现您的目标。
希望有帮助!



