elasticsearch - Elasticsearch筛选聚合结果(用于搜索和聚合)

标签 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-14之间的所有平均订单的所有用户在amout字段的桶[0,10]和[10,20]之间分配平均价格。

除此问题外,答案I在存储桶[0,10]中为0,在存储桶[10,20]中为1(由于用户的平均价格,仅保留了用户1。他的平均数量为11.5,因此在存储桶[10]中,20])。

我尝试过的

我已经对我的过滤器执行了操作,以便检索平均订单价格在9-14之间的用户。我首先对用户字段进行了术语汇总。然后,我做一个子集合,它是价格的平均集合。然后,我进行存储桶选择器管道聚合,检查先前计算的平均价格是否在9到14之间。

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

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

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

最佳答案

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

  • 对用户进行术语汇总。
  • 作为术语聚合的子聚合,进行平均聚合来计算价格的平均值。
  • 作为术语聚合的子聚合,可以进行avg聚合,以计算金额的平均值。
  • 执行存储桶选择器管道聚合,该聚合过滤器仅将avg_price保持在[9-14]范围内。
  • 进行桶选择器管道聚合以进行过滤,以仅将avg_amount保留在[0-10]
  • 执行“计数”存储桶脚本管道聚合(脚本返回一个)。
  • 执行存储桶总和管道聚合以求和。
  • 对所有想要的范围([0-10],[10-20])重复所有步骤
  • 关于elasticsearch - Elasticsearch筛选聚合结果(用于搜索和聚合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307352/

    相关文章:

    python - Pandas:为具有多列的数据框实现groupby +聚合的优雅方法?

    elasticsearch - 列表内的ElasticSearch范围

    elasticsearch - logstash转换为日期,并且仅在kibana中使用日期部分

    elasticsearch - 带有term和function_score,parsing_exception的Elasticsearch has_child查询

    javascript - 当被过滤的数组包含 JSON 数据时,为什么我会收到 'cannot read property ' filter' of undefined' ?

    PHP - ldap_search() 过滤器。如何搜索用户

    java - Elasticsearch如何在聚合结果后求和值

    java - 使用 Java API 的 BoolQuery 中的 NestedQuery

    android - 从过滤后的 ListView 中获取原始 ID

    elasticsearch - 获取 HitTest 门命中数组聚合的唯一文档数sum_other_doc_count