弹性搜索中的多个分组依据包括缺失值
multiple group by in elasticsearch including missing values
我正在尝试在 elasticsearch 中按多个字段进行分组。我知道存在嵌套聚合,但我想要的是在某个存储桶中包含我分组依据的字段为空的记录。
假设我们有这样的数据结构:
SONG_ID | SONG_GENRE | SONG_ARTIST
我想按类型、艺术家分组。
我想为每个可能的组合创建一个组,即
按流派分组给我 5 个桶(如果流派是 5)加上没有流派的歌曲所在的桶。然后按艺术家分组给我,对于每个流派,艺术家桶加上没有艺术家的歌曲。
基本上,我希望获得与使用分组依据相同的结果。这可能吗?
您可以通过不同的方式来解决您的需求。
如果类型不存在,最简单的方法是针对 songs
的 genre
字段索引固定值 "notmentioned"。您可以在索引时或通过在字段映射中定义 "null_value" 来完成。
"SONG_GENRE": {"type": "string", "null_value": "notmentioned"},
"SONG_ARTIST": {"type": "string", "null_value": "notmentioned"},
因此在聚合(嵌套)过程中,您会自动找到 "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"
}
}
}
}
}
}
}
我还没有验证语法。只是给大家一个思路
另一种黑客方法可能是将缺失计数(总点击数 - 所有聚合计数)视为针对无类型的计数。
我正在尝试在 elasticsearch 中按多个字段进行分组。我知道存在嵌套聚合,但我想要的是在某个存储桶中包含我分组依据的字段为空的记录。
假设我们有这样的数据结构:
SONG_ID | SONG_GENRE | SONG_ARTIST
我想按类型、艺术家分组。 我想为每个可能的组合创建一个组,即
按流派分组给我 5 个桶(如果流派是 5)加上没有流派的歌曲所在的桶。然后按艺术家分组给我,对于每个流派,艺术家桶加上没有艺术家的歌曲。
基本上,我希望获得与使用分组依据相同的结果。这可能吗?
您可以通过不同的方式来解决您的需求。
如果类型不存在,最简单的方法是针对 songs
的 genre
字段索引固定值 "notmentioned"。您可以在索引时或通过在字段映射中定义 "null_value" 来完成。
"SONG_GENRE": {"type": "string", "null_value": "notmentioned"},
"SONG_ARTIST": {"type": "string", "null_value": "notmentioned"},
因此在聚合(嵌套)过程中,您会自动找到 "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"
}
}
}
}
}
}
}
我还没有验证语法。只是给大家一个思路
另一种黑客方法可能是将缺失计数(总点击数 - 所有聚合计数)视为针对无类型的计数。