对ElasticSearch中的唯一值求和

ymzxtsji  于 2022-12-26  发布在  ElasticSearch
关注(0)|答案(1)|浏览(138)

bounty将在15小时后过期。此问题的答案可获得+50声望奖励。ldrg正在查找规范答案:在ElasticSearch中可能无法做到这一点,因为团队在查询引擎中设置了一些困难的权衡/限制。如果是这样,解释这些权衡以及为什么它阻止查询的进行是一个可以接受的答案。

我有一个这样的文件索引:

{
    "id": ...,
    "value": ...,
}

它是反规格化的,所以相同的id会出现多次,但是它们都有相同的value
我想对不同的值求和,也就是下面这个SQL的等价物:

SELECT sum(value)
FROM (
    SELECT id, value
    FROM index
    GROUP BY id, value
) inner

可以在Elasticsearch中实现吗?我尝试使用sum_buckets聚合,如下所示:

{
 "aggs": {
  "uniq_id": {
    "terms": {"field": "id"},
    "aggs": {
      "avg_value": {
        "avg": {
            "field": "value"
        }
      }
    }
  },
  "sum_value": {
    "sum_bucket": {
        "buckets_path": "uniq_id>avg_value"
    }
  }
 },
 "size": 0
}

但是没有办法对所有存储桶进行彻底求和,您只能使用terms聚合的size,这可能吗?

r7knjye2

r7knjye21#

您可以通过top_hits聚合collapse参数来实现这一点。
下面是top_hits的一个示例

{
  "aggs": {
    "uniq_id": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "top_values": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "value": {
                  "order": "desc"
                }
              }
            ]
          }
        },
        "sum_value": {
          "sum": {
            "field": "value"
          }
        }
      }
    }
  },
  "size": 0
}

以下是针对您的案例的修改版本,其中包含sum_buckets和top_hits

{
  "size": 0,
  "aggs": {
    "uniq_id": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "top_value": {
          "top_hits": {
            "size": 1,
            "_source": {
              "includes": ["value"]
            }
          }
        }
      }
    },
    "sum_value": {
      "sum_bucket": {
        "buckets_path": "uniq_id>top_value>hits>hits>value"
      }
    }
  }
}

相关问题