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

标签 elasticsearch kibana

我正在使用 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/

相关文章:

elasticsearch - Kibana 索引模式刷新选项不再存在

java - Elasticsearch Java API - boolean 查询运算符

elasticsearch - Cakephp 4.0.1 ElasticSearch插件问题

elasticsearch - 安装ELK后,Ubuntu服务器的CPU使用率迅速提高

elasticsearch - Kibana开发工具和elasticsearch-py客户端获得不同的输出

elasticsearch - Kibana多个关键字过滤器

elasticsearch - Kibana 4 自定义仪表板

scala - 如何使用Scala在ElasticSearch中获取_delete_by_query api的状态

elasticsearch - postman 对 Elasticsearch 的 POST 请求有错误

elasticsearch - 从日志文件中抽出时间