弹性搜索中的多个组,包括缺失值

时间:2015-05-13 10:37:15

标签: php elasticsearch grouping kibana

我正在尝试通过弹性搜索,多个字段进行分组。我知道嵌套聚合存在,但我想要的是在某个存储桶中包含我正在分组的字段为空的记录。

假设我们有这种数据结构:

SONG_ID | SONG_GENRE | SONG_ARTIST

我希望按照艺术家的分组进行分组。 我希望每个可能的组合都有一个组,即

按类型分组给我5个桶(如果类型是5)加上没有类型的歌曲的桶。然后由艺术家进行分组,为每种类型提供艺术家的乐趣以及没有艺术家的歌曲。

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

1 个答案:

答案 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"
                        }
                    }
                }
            }
        }
    }
}

我还没有验证语法。它只是给你一个想法

另一种黑客攻击方式可能是将缺失的计数(总命中数 - 所有聚合计数)视为无类型的计数。