首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Elasticsearch中的多个分组依据

Elasticsearch中的多个分组依据
EN

Stack Overflow用户
提问于 2015-07-14 07:19:15
回答 1查看 310关注 0票数 0

如何为下面的SQL查询编写一个高效的ES查询?

代码语言:javascript
运行
复制
Select sum(visits) visits
from index
group by ip, port
order by visits desc
limit 10

我正在使用下面的ES查询,但这将排序访问内部端口存储桶。我不想在根据目的地ip和端口对它们进行分组后获得最高访问量。

代码语言:javascript
运行
复制
"aggregations" : {
    "ip": 
    {
        "terms": 
        {
            "field": "ip",
            "size": 10
        },
        "aggregations": 
        {
            "port": 
            {
                "terms": 
                {
                    "field": "port",
                    "size": 0,
                    "order": 
                    {
                        "visits": "desc"
                    }
                },
                "aggregations": 
                {
                    "visits": 
                    {
                        "sum": 
                        {
                            "field": "visits"
                        }
                    }
                }
            }
        }
    }
}

有人能帮我一下吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-07-15 02:12:01

Elasticsearch中的数据

代码语言:javascript
运行
复制
 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             200

ES响应

代码语言:javascript
运行
复制
    1.1.1.1        
             57             200
             80             50
    1.1.1.2       
             80             10 
    1.1.1.3        
             20             100  

预期的

代码语言:javascript
运行
复制
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个访问

解决方案

使用脚本合并两个字段并应用分组依据

代码语言:javascript
运行
复制
 {
  "size": 0,
  "aggs": {
    "destination": {
      "terms": {
        "script": "doc['ip'].value +  ':'  + doc['port'].value", "order": {
          "visits": "desc"
        }
      },
                "aggregations": 
                {
                    "visits": 
                    {
                        "sum": 
                        {
                            "field": "visits"
                        }

                    }
                }
    }
  }
}

希望这能对你有所帮助。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31395088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档