你可以试试 Axibase时间序列数据库 这是非关系型的,但除了类似rest的API之外还支持SQL查询。这是一个Top-N查询示例:
SELECT entity, avg(value) FROM cpu_busy WHERE time between now - 1 * hour and now GROUP BY entity ORDER BY avg(value) DESC LIMIT 3
https://axibase.com/docs/atsd/sql/#grouping
ATSD社区版是免费的。
披露:我为Axibase工作
我不明白为什么ES无法满足您的要求。我想你误解了这一部分
但它也不合适。因为聚合多个列时,必须在elasticsearch中使用所谓的嵌套桶聚合。并且无法对此聚合的结果进行排序。
你的第一个要求 的 使用时间戳绘制一条线 强> 可以通过这样的查询/聚合轻松实现:
{ "query": { "bool": { "must": [ { "term": { "interface": 1 } }, { "term": { "router": "r1" } } ] } }, "aggs": { "by_minute": { "date_histogram": { "field": "timestamp", "interval": "1m" }, "aggs": { "sum_bits": { "sum": { "field": "bits" } } } } } }
至于你的第二个要求 的 找出哪个3 src_ip为一个接口发送最多的数据 强> ,它也可以通过像这样的查询/聚合轻松实现:
{ "query": { "bool": { "must": [ { "term": { "interface": 2 } }, { "term": { "router": "r1" } } ] } }, "aggs": { "by_src_ip": { "terms": { "field": "src_ip", "size": 3, "order": { "sum_bits": "desc" } }, "aggs": { "sum_bits": { "sum": { "field": "bits" } } } } } }
的 UPDATE 强>
根据您的评论,您上面的第二个要求可能会更改为找到src_ip / dst_ip的前3个组合。这是可行的 terms 使用a进行聚合 script 而不是一个将构建src / dest组合并为每对夫妇提供位总和的术语,如下所示:
terms
script
{ "query": { "bool": { "must": [ { "term": { "interface": 2 } }, { "term": { "router": "r1" } } ] } }, "aggs": { "by_src_ip": { "terms": { "script": "[doc.src_ip.value, doc.dst_ip.value].join('-')", "size": 3, "order": { "sum_bits": "desc" } }, "aggs": { "sum_bits": { "sum": { "field": "bits" } } } } } }
请注意,为了运行最后一个查询,您需要 启用动态脚本 。此外,由于您将拥有数十亿份文档,脚本编写可能不是最佳解决方案,但在进一步深入探讨之前值得尝试一下。另一个可能的解决方案是添加一个 combination 场( src_ip-dst_ip )在索引时,以便您可以将其用作术语聚合中的字段,而无需使用脚本。
combination
src_ip-dst_ip