Elasticsearch按字段前缀聚合

时间:2017-02-24 22:13:49

标签: elasticsearch

我有

形式的数据条目
{
   "id": "ABCxxx",
   // Other fields
}

其中ABC是唯一标识符,用于定义"类型"这个记录。 (例如,用户为USR1234...,图像为IMG1234...

我想获得我在ES中所有不同类型记录的列表。所以本质上我想按id进行排序,但只查看id的前三个字符。

这显然不起作用,因为它按id排序(因此USR123USR456不同):

{
    "fields": ["id"],
    "aggs": {
        "group_by_id": {
            "terms": {
                "field": "id"
            }
        }
    }
}

如何撰写此查询?

2 个答案:

答案 0 :(得分:1)

正如 paqash 所建议的那样,可以通过脚本实现同样的效果,但我会建议另外一种存储"类型"在您的架构中完全不同的字段。

例如。

USR1234 : {id:"USR1234", type:"USR"}
IMG1234 : {id:"USR1234", type:"IMG"}

这样可以避免脚本中不必要的复杂化并保持查询界面的清洁。

答案 1 :(得分:0)

您可以使用无痛脚本语言来完成此任务。

{
    "fields": ["id"],
    "aggs": {
        "group_by_id": {
            "terms": {
                "script" : {
                    "inline": "doc['id'].substring(0,3)",
                    "lang": "painless"
                }
            }
        }
    }
}

更多信息here。请注意,substring方法的语法可能不完全正确。