我想知道是否可以将此sql查询转换为ES查询? 按app,cat 从错误组中选择前10名app,cat,count(*)
或者用英语回答:"显示热门应用,猫及其数量",这样就可以按多个字段进行分组并返回姓名和计数。
答案 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
}
]
}
}
}
在客户端,您可以通过字符串操作从聚合响应中获取app
和cat
字段的各个值。
在较新版本的Elasticsearch中,出于安全原因,默认情况下会禁用脚本。如果要启用脚本,请阅读this。
答案 1 :(得分:1)
Terms aggregation正是您要找的。 p>