弹性搜索中的多个分组依据包括缺失值

multiple group by in elasticsearch including missing values

我正在尝试在 elasticsearch 中按多个字段进行分组。我知道存在嵌套聚合,但我想要的是在某个存储桶中包含我分组依据的字段为空的记录。

假设我们有这样的数据结构:

SONG_ID | SONG_GENRE | SONG_ARTIST

我想按类型、艺术家分组。 我想为每个可能的组合创建一个组,即

按流派分组给我 5 个桶(如果流派是 5)加上没有流派的歌曲所在的桶。然后按艺术家分组给我,对于每个流派,艺术家桶加上没有艺术家的歌曲。

基本上,我希望获得与使用分组依据相同的结果。这可能吗?

您可以通过不同的方式来解决您的需求。

如果类型不存在,最简单的方法是针对 songsgenre 字段索引固定值 "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"
                        }
                    }
                }
            }
        }
    }
}

我还没有验证语法。只是给大家一个思路

另一种黑客方法可能是将缺失计数(总点击数 - 所有聚合计数)视为针对无类型的计数。