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
,这可能吗?
1条答案
按热度按时间r7knjye21#
您可以通过top_hits聚合collapse参数来实现这一点。
下面是top_hits的一个示例
以下是针对您的案例的修改版本,其中包含sum_buckets和top_hits