Elasticsearch过滤聚合结果(用于搜索和聚合)

时间:2019-10-09 15:19:21

标签: elasticsearch filter aggregation elasticsearch-aggregation

该问题的一部分与: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之间。

我也设法进行了想要的聚合,但是没有以前的过滤器。对于每个范围,我所做的操作与过滤器完全相同。然后我计算每个存储桶中的结果数。

我找不到任何对存储桶选择器结果应用其他聚合的方法。所以我不能先做过滤器,然后再应用范围...

这些解决方案也不是很好。.我不认为它们会扩展,因为文档的很大一部分需要在答案中返回并进一步处理(即使它不在互联网上,我也希望避免这样做,而我可能会限制聚合的结果大小?)。

1 个答案:

答案 0 :(得分:1)

我设法找到了一个解决方案,但是它并不优雅,而且扩展性很差。

  • 对用户进行术语汇总。
  • 作为术语聚合的子聚合,进行平均聚合,以计算价格的平均值。
  • 作为术语聚合的子聚合,进行平均聚合,以计算金额的平均值。

  • 执行存储桶选择器管道聚合,该聚合过滤器仅将avg_price保持在[9-14]范围内。

  • 执行存储桶选择器管道聚合以进行过滤,以仅将avg_amount保持在[0-10]
  • 执行“计数”存储桶脚本管道聚合(脚本返回一个)。
  • 进行存储桶总和管道聚合以求和。
  • 针对所需的所有范围([0-10],[10-20])重复所有步骤
相关问题