该问题的一部分与:Elasticsearch filter on aggregation
有关上下文
比方说,我的Elasticsearch索引包含一些订单。每个订单有一个场价和一个场量。这样就得到了如下所示的索引:
[
{
"docKey": "order01",
"user": "1",
"price": 8,
"amount": 20
},
{
"docKey": "order02",
"user": "1",
"price": 14,
"amount": 3
},
{
"docKey": "order03",
"user": "2",
"price": 5,
"amount": 1
},
{
"docKey": "order04",
"user": "2",
"price": 10,
"amount": 3
}
]
我想做什么
我想做的是对每个用户汇总的某些值进行过滤。我想对搜索进行这种过滤,也希望对其应用聚合。例如,在此示例中,我要检索其平均订单价格在9-14之间的所有用户的文档。
用户1的平均价格订单为11,因此我们保留了他的两个订单。 用户2的平均价格订单为7.5,因此不会保留两个订单。
这是容易的部分。经过我的筛选,只得到用户一个。我想对结果进行更多汇总。
因此,例如:对于所有具有平均价格在9范围内的用户,我希望在存储桶[0,10]和[10,20]中重新分配amout字段的每个用户的平均值-14。
除此问题外,答案I在存储桶[0,10]中为0,在存储桶[10,20]中为1(由于用户的平均价格,仅保留了用户1。他的平均金额为11.5,因此在用户桶[10,20])。
我尝试过的事情
我设法对过滤器执行操作,以便检索平均订单价格在9-14之间的用户。我首先对用户提交的字词进行了汇总。然后,我做一个子集合,它是价格的平均集合。然后,我进行了桶选择器管道聚合,检查先前计算的平均价格是否在9到14之间。
我也设法进行了想要的聚合,但是没有以前的过滤器。对于每个范围,我所做的操作与过滤器完全相同。然后我计算每个存储桶中的结果数。
我找不到任何对存储桶选择器结果应用其他聚合的方法。所以我不能先做过滤器,然后再应用范围...
这些解决方案也不是很好。.我不认为它们会扩展,因为文档的很大一部分需要在答案中返回并进一步处理(即使它不在互联网上,我也希望避免这样做,而我可能会限制聚合的结果大小?)。
答案 0 :(得分:1)
我设法找到了一个解决方案,但是它并不优雅,而且扩展性很差。
作为术语聚合的子聚合,进行平均聚合,以计算金额的平均值。
执行存储桶选择器管道聚合,该聚合过滤器仅将avg_price保持在[9-14]范围内。