elasticsearch如何查找出现次数

时间:2015-05-11 16:48:46

标签: elasticsearch

我想知道是否可以将此sql查询转换为ES查询? 按app,cat 从错误组中选择前10名app,cat,count(*)

或者用英语回答:"显示热门应用,猫及其数量",这样就可以按多个字段进行分组并返回姓名和计数。

2 个答案:

答案 0 :(得分:3)

要汇总多个字段的组合,您必须使用Terms Aggregation中的脚本编写,如下所示:

POST <index name>/<type name>/_search?search_type=count
{
  "aggs": {
    "app_cat": {
      "terms": {
        "script" : "doc['app'].value + '#' + doc['cat'].value",
        "size": 10
      }
    }
  }
}

我使用#作为分隔符,假设它不存在于app和/或cat字段的任何值中。您可以使用您选择的任何其他分隔符。您将收到类似下面的回复:

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 10,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "app_cat": {
         "buckets": [
            {
               "key": "app2#cat2",
               "doc_count": 4
            },
            {
               "key": "app1#cat1",
               "doc_count": 3
            },
            {
               "key": "app2#cat1",
               "doc_count": 2
            },
            {
               "key": "app1#cat2",
               "doc_count": 1
            }
         ]
      }
   }
}

在客户端,您可以通过字符串操作从聚合响应中获取appcat字段的各个值。

在较新版本的Elasticsearch中,出于安全原因,默认情况下会禁用脚本。如果要启用脚本,请阅读this

答案 1 :(得分:1)

Terms aggregation正是您要找的。