elasticsearch - 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" }
]
}
有没有一种方法可以在没有特定人作为固定起点的情况下聚合成对的人?例如
- 马丁斯科塞斯和罗伯特德尼罗:4
- 马丁斯科塞斯和乔佩西:3
- 罗伯特·德尼罗和乔·佩西:3
- 罗伯特·德尼罗和阿尔·帕西诺:2
- 马丁斯科塞斯和雷利奥塔:1
- …</li>
我也想要:
仅指定 Director-Actor 对,例如
- 马丁斯科塞斯和罗伯特德尼罗:4
- 马丁斯科塞斯和乔佩西:3
- 马丁斯科塞斯和雷利奥塔:1
- 马丁斯科塞斯和尼克诺尔特:1
- 迈克尔·曼和罗伯特·德尼罗:1
- …</li>
将对增加到三元组、四元组等,例如三元组:
- 马丁斯科塞斯、罗伯特德尼罗和乔佩西:3
- 马丁斯科塞斯、罗伯特德尼罗和弗兰克文森特:2
- 马丁·斯科塞斯、罗伯特·德尼罗和雷·利奥塔:1
- 马丁·斯科塞斯、雷·利奥塔和乔·佩西:2
- 罗伯特·德尼罗、雷·利奥塔和弗兰克·文森特:2
- …</li>
包括组合的推导(这可能需要多级聚合),例如
- 马丁斯科塞斯和罗伯特德尼罗:4(好家伙,开普菲尔,赌场,爱尔兰人)
- 马丁斯科塞斯和乔佩西:3(好家伙,赌场,爱尔兰人)
- 罗伯特德尼罗和乔佩西:3(好家伙,赌场,爱尔兰人)
- 罗伯特·德尼罗和阿尔·帕西诺:2(热火队,爱尔兰人)
- 马丁斯科塞斯和雷利奥塔:(好家伙)
我能想到的潜在解决方案是:
- 在索引文档之前计算对,并将其作为属性包含在可以用作聚合的术语上,例如
compoundId
Goodfellas 的一组值将是:101-102
,101-103
,101-104
,102-103
,102-104
,103-104
(尽管需要一些后续逻辑来获取这些 ID 所代表的人的相应名称)。 - 编写一个无痛脚本,可以在查询时计算对,尽管考虑到每个文档可能具有的众多人员组合,并且对于大量数据(比如说大约 100 万个文档)重复这一点,这样的查询很可能会遇到困难并且在实时应用程序中重复使用是不切实际的。
理想情况下,我希望能够使用单个 Elasticsearch 聚合来生成这些结果,尽管理解这可能是不可能的。
这个问题有什么解决方案?
提前致谢。
解决方案
推荐阅读
- node.js - 无法安装作曲家休息服务器
- php - 如何在 wp_query 循环中获取下一篇文章的类别
- java - 我如何从 HttpClient 获取承载令牌?
- javascript - 导出没有装饰器的纯功能组件
- dynamics-crm - Microsoft USD - 通过 CRM 页面按钮单击在 USD 选项卡中打开第三方应用程序
- java - 为 elasticsearch 设置会话 cookie
- android - 为什么我在主线程中发布了一个 Runnable,但 Runnable 是在 HandlerThread 中执行的?
- python - 我可以使用 Mypy 存根作为接口吗?
- java - 如何检查sqlite数据库中是否存在记录?
- r - 使用 R plotly plot_dendro 绘制旋转树状图