我正在尝试通过弹性搜索,多个字段进行分组。我知道嵌套聚合存在,但我想要的是在某个存储桶中包含我正在分组的字段为空的记录。
假设我们有这种数据结构:
SONG_ID | SONG_GENRE | SONG_ARTIST
我希望按照艺术家的分组进行分组。 我希望每个可能的组合都有一个组,即
按类型分组给我5个桶(如果类型是5)加上没有类型的歌曲的桶。然后由艺术家进行分组,为每种类型提供艺术家的乐趣以及没有艺术家的歌曲。
基本上,我希望得到与使用分组相同的结果。这甚至可能吗?
答案 0 :(得分:0)
您可以通过不同的方式来解决您的需求。
最简单的方法是,如果不存在类型,则将修改后的值称为“未提及”genre
字段songs
。您可以在索引时或通过在字段映射中定义“null_value”来执行此操作。
"SONG_GENRE": {"type": "string", "null_value": "notmentioned"},
"SONG_ARTIST": {"type": "string", "null_value": "notmentioned"},
因此,在聚合(嵌套)期间,您将自动为没有流派的歌曲找到“未提及”的计数。
另一种方法是将丢失的过滤器用作另一个聚合以及正常聚合。像下面的东西。
{
"aggs": {
"SONG_GENRE": {
"terms": {
"field": "SONG_GENRE"
},
"aggs": {
"SONG_ARTIST": {
"terms": {
"field": "SONG_ARTIST"
}
},
"MISSING_SONG_ARTIST": {
"filter": {
"missing": {
"field": "SONG_ARTIST"
}
}
}
}
},
"MISSING_SONG_GENRE": {
"filter": {
"missing": {
"field": "SONG_GENRE"
}
},
"aggs": {
"MISSING_SONG_GENRE_SONG_ARTIST": {
"terms": {
"field": "SONG_ARTIST"
}
},
"MISSING_SONG_GENRE_MISSING_SONG_ARTIST": {
"filter": {
"missing": {
"field": "SONG_ARTIST"
}
}
}
}
}
}
}
我还没有验证语法。它只是给你一个想法
另一种黑客攻击方式可能是将缺失的计数(总命中数 - 所有聚合计数)视为无类型的计数。