如何为下面的SQL查询编写一个高效的ES查询?
Select sum(visits) visits
from index
group by ip, port
order by visits desc
limit 10我正在使用下面的ES查询,但这将排序访问内部端口存储桶。我不想在根据目的地ip和端口对它们进行分组后获得最高访问量。
"aggregations" : {
"ip":
{
"terms":
{
"field": "ip",
"size": 10
},
"aggregations":
{
"port":
{
"terms":
{
"field": "port",
"size": 0,
"order":
{
"visits": "desc"
}
},
"aggregations":
{
"visits":
{
"sum":
{
"field": "visits"
}
}
}
}
}
}
}有人能帮我一下吗?
谢谢。
发布于 2015-07-15 02:12:01
Elasticsearch中的数据
ip port visits
1.1.1.1 80 10
1.1.1.2 80 10
1.1.1.1 80 20
1.1.1.3 20 100
1.1.1.1 57 20
1.1.1.1 57 200ES响应
1.1.1.1
57 200
80 50
1.1.1.2
80 10
1.1.1.3
20 100 预期的
1.1.1.1
57 200
1.1.1.3
20 100
1.1.1.1
80 50
1.1.1.2
80 10 ES的作用是,首先按ip和端口分组,最后在端口聚合器内部通过desc对访问进行汇总和安排访问。因此,这不会给出前10个访问,而是给出每个端口内的前10个访问
解决方案
使用脚本合并两个字段并应用分组依据
{
"size": 0,
"aggs": {
"destination": {
"terms": {
"script": "doc['ip'].value + ':' + doc['port'].value", "order": {
"visits": "desc"
}
},
"aggregations":
{
"visits":
{
"sum":
{
"field": "visits"
}
}
}
}
}
}希望这能对你有所帮助。
https://stackoverflow.com/questions/31395088
复制相似问题