ElasticSearch group by和aggregate

时间:2018-02-14 05:26:30

标签: ruby elasticsearch aggregate-functions

我在ES中有一堆网络流量日志,并希望获得每个源的一些高级别统计信息:dest对。

在SQL中,我会做类似的事情:

SELECT src, dst, SUM(bytes)
FROM net_traffic
WHERE start>1518585000000
AND end<1518585300000
GROUP BY src, dst

开始结束只是看到流量的纪元时代)

如何从存储在ES中的数据中提取相同的信息?

我正在使用Ruby编写解决方案,但理想情况下只需要一个ES查询来提取数据 - 所以解决方案有望与实现语言无关。

1 个答案:

答案 0 :(得分:0)

ElasticSearch支持子聚合。您必须使用,然后在您的应用程序端将查询结果转换为您想要的结果。

查询:

{
    "size": 0,
    "aggs": {
        "src_agg": {
            "terms": {
                "field": "src"
            },
            "aggs": {
                "dst_agg": {
                    "terms": {
                        "field": "dst"
                    }
                }
            }
        }
    }
}

结果样本:

{
    "key": "X1",
    "doc_count": 5,
    "agg2": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "Y1",
            "doc_count": 2 // ***
        },
        {
            "key": "Y2",
            "doc_count": 3  // ***
        }]
    }
}

您可以从结果中的***中提取所需数据:

(X1, Y1) = 2, (X1, Y2) = 3