我在ES中有一堆网络流量日志,并希望获得每个源的一些高级别统计信息:dest对。
在SQL中,我会做类似的事情:
SELECT src, dst, SUM(bytes)
FROM net_traffic
WHERE start>1518585000000
AND end<1518585300000
GROUP BY src, dst
(开始和结束只是看到流量的纪元时代)
如何从存储在ES中的数据中提取相同的信息?
我正在使用Ruby编写解决方案,但理想情况下只需要一个ES查询来提取数据 - 所以解决方案有望与实现语言无关。
答案 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