Elasticsearch在多字段上聚合或按多字段分组

时间:2016-01-04 06:27:24

标签: sorting elasticsearch group-by

我有以下格式的数据

src_ip     dst_ip     size
1.1.1.1    2.2.2.2    80

我尝试使用弹性来达到与SQL statememt相同的结果

select src_ip, dst_ip, sum(size) from table order by sum(size) limit 1:10

换句话说,我试图在src_ip和dst_ip聚合后获得前10名结果。

我知道我可以像下面那样做桶聚合:

"aggs":
{
    "SRC_IP": 
    { 
        "terms": { "field": "SRC_IP"},
        "aggs": 
        {
            "DST_IP":
            {
                "terms": { "field": "DST_IP"} ,  
                "aggs": 
                {
                            "totalPACKETS": { "sum": { "field": "PACKETS" } }
                }
            }
        }
    }
}

问题是,通过这种方式,结果不按sum(大小)排序。即使我添加了一个order子句,它只能在一个存储桶中按sum(size)排序,而不是在全局范围内排序。

任何人都可以告诉你该怎么做吗?

1 个答案:

答案 0 :(得分:0)

可以使用脚本功能完成。例如:

  "aggs":
    {
      "SRC_DST":
        {
          "terms": {"script": "[doc.SRC_IP.value, doc.DST_IP.value].join(\"-\")","size": 2,"shard_size":0, "order": {"sum_bits": "desc"}},
          "aggs": { "sum_bits": { "sum": {"field": "BYTES"} } }
        }
    }