gpt4 book ai didi

elasticsearch - 如何在 ElasticSearch 中进行嵌套聚合,其中聚合超过子聚合的结果

转载 作者:行者123 更新时间:2023-12-02 23:25:35 28 4
gpt4 key购买 nike

我正在使用 ElasticSearch 5.3。如果您能指导我如何在 ES 或 Kibana 中完成此操作,将不胜感激。我已经阅读了文档,尤其是关于范围、嵌套和管道聚合的文档,并且根本无法获得任何工作或产生我所追求的。

我不想用通用术语描述我想要的东西,而是将我的问题表述为关系数据库问题:

这是我的 table :

CREATE TABLE metrics
(`host` varchar(50), `counter` int, `time` int)
;

INSERT INTO metrics
(`host`, `counter`, `time`)
VALUES
('host1', 3, 1),
('host2', 2, 2),
('host3', 1, 3)
,('host1', 5, 4)
,('host2', 2, 5)
,('host3', 2, 6)
,('host1', 9, 7)
,('host2', 3, 8)
,('host3', 5, 9)
;

我想获取所有主机的计数器的总值。请注意,每个主机都会为某个计数器发出一个不断增加的值,因此我不能只为每条记录添加计数器。相反,我需要使用以下 SQL:
select sum(max_counter)
from ( select max(counter) as max_counter
from metrics
where time > 0 AND time < 10
group by host) as temptable;

这会产生正确的结果: 17 (= 9 + 3 + 5)

最佳答案

您可以通过管道聚合来实现它

{
"size": 0,
"aggs": {
"hosts": {
"terms": {
"field": "host"
},
"aggs": {
"maxCounter": {
"max": {
"field": "counter"
}
}
}
},
"sumCounter": {
"sum_bucket": {
"buckets_path": "hosts>maxCounter"
}
}
},
"query": {
"range": {
"time": {
"gt": 0.0,
"lt": 10.0
}
}
}
}

首先,您按 host 对条目进行分组。 hosts 中的字段聚合。然后在里面你申请 max聚合。然后添加 sum_bucket接受前一个结果并返回所需总和的聚合。您还可以使用 range 过滤您的条目询问。

这是一个结果
{
"took": 22,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 9,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"hosts": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "host1",
"doc_count": 3,
"maxCounter": {
"value": 9.0
}
},
{
"key": "host2",
"doc_count": 3,
"maxCounter": {
"value": 3.0
}
},
{
"key": "host3",
"doc_count": 3,
"maxCounter": {
"value": 5.0
}
}
]
},
"sumCounter": {
"value": 17.0
}
}
}
sumCounter等于 17。

以防万一,这是原始映射
{
"mappings": {
"metrics": {
"properties": {
"host": {
"type": "text",
"fielddata": true
},
"counter": {
"type": "integer"
},
"time": {
"type": "integer"
}
}
}
}
}

关于elasticsearch - 如何在 ElasticSearch 中进行嵌套聚合,其中聚合超过子聚合的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690093/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com