这个问题的一部分与: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-14之间的所有平均订单的所有用户在amout字段的桶[0,10]和[10,20]之间分配平均价格。
除此问题外,答案I在存储桶[0,10]中为0,在存储桶[10,20]中为1(由于用户的平均价格,仅保留了用户1。他的平均数量为11.5,因此在存储桶[10]中,20])。
我尝试过的
我已经对我的过滤器执行了操作,以便检索平均订单价格在9-14之间的用户。我首先对用户字段进行了术语汇总。然后,我做一个子集合,它是价格的平均集合。然后,我进行存储桶选择器管道聚合,检查先前计算的平均价格是否在9到14之间。
我也设法完成了想要的聚合,但是没有以前的过滤器。对于每个范围,我所做的操作与过滤器完全相同。然后,我计算每个存储桶中的结果数。
我找不到任何将其他聚合应用于存储桶选择器结果的方法。所以我不能先做过滤器,然后再应用范围...
这些解决方案也不是很好。.我不认为它们会扩大,因为文档的很大一部分需要在答案中返回并进一步处理(即使它不在互联网上,我也希望避免这样做,而且我可能会受到限制)的结果大小?)。
最佳答案
我设法找到一个解决方案,但是它并不优雅,并且可能扩展性很差。
关于elasticsearch - Elasticsearch筛选聚合结果(用于搜索和聚合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307352/