首页 > 解决方案 > Elasticsearch:嵌套文档的聚合组合

问题描述

使用 Elasticsearch,我想聚合嵌套文档的组合。

使用这些映射对电影数据进行假设索引:

{
    mappings: {
        properties: {
            title: {
                type: 'keyword'
            },
            people: {
                type: 'nested',
                properties: {
                    id: {
                        type: 'keyword'
                    },
                    name: {
                        type: 'keyword'
                    },
                    role: {
                        type: 'keyword'
                    }
                }
            }
        }
    }
}

这些文档:

{
    title: "Goodfellas",
    people: [
        { id: '101', name: "Martin Scorsese", role: "Director" },
        { id: '102', name: "Robert De Niro", role: "Actor" },
        { id: '103', name: "Ray Liotta", role: "Actor" },
        { id: '104', name: "Joe Pesci", role: "Actor" },
        { id: '105', name: "Frank Vincent", role: "Actor" }
    ]
},
{
    title: "Cape Fear",
    people: [
        { id: '101', name: "Martin Scorsese", role: "Director" },
        { id: '102', name: "Robert De Niro", role: "Actor" },
        { id: '106', name: "Nick Nolte", role: "Actor" },
        { id: '107', name: "Jessica Lange", role: "Actor" }
    ]
},
{
    title: "Casino",
    people: [
        { id: '101', name: "Martin Scorsese", role: "Director" },
        { id: '102', name: "Robert De Niro", role: "Actor" },
        { id: '108', name: "Sharon Stone", role: "Actor" },
        { id: '104', name: "Joe Pesci", role: "Actor" },
        { id: '105', name: "Frank Vincent", role: "Actor" }
    ]
},
{
    title: "Heat",
    people: [
        { id: '109', name: "Michael Mann", role: "Director" },
        { id: '110', name: "Al Pacino", role: "Actor" },
        { id: '102', name: "Robert De Niro", role: "Actor" },
        { id: '111', name: "Val Kilmer", role: "Actor" }
    ]
}
{
    title: "The Irishman",
    people: [
        { id: '101', name: "Martin Scorsese", role: "Director" },
        { id: '102', name: "Robert De Niro", role: "Actor" },
        { id: '110', name: "Al Pacino", role: "Actor" },
        { id: '104', name: "Joe Pesci", role: "Actor" }
    ]
}

有没有一种方法可以在没有特定人作为固定起点的情况下聚合成对的人?例如

我也想要:

仅指定 Director-Actor 对,例如

将对增加到三元组、四元组等,例如三元组:

包括组合的推导(这可能需要多级聚合),例如

我能想到的潜在解决方案是:

理想情况下,我希望能够使用单个 Elasticsearch 聚合来生成这些结果,尽管理解这可能是不可能的。

这个问题有什么解决方案?

提前致谢。

标签: elasticsearchelasticsearch-aggregationelasticsearch-dsl

解决方案


推荐阅读