根据您的描述,我们可以看出“基础文档”都是基于用户的。
现在,关于您的问题:
- 根据我之前所说,您可以将与每个用户关联的所有项目添加为一个数组。像这样:
{
"user_name": "John W.",
..., #More information from this user
"projects": [
{
"project_name": "project_1",
"role": "Dev",
"category": "Business Intelligence",
},
{
"project_name": "project_3",
"role": "QA",
"category": "Machine Learning",
}
]
},
{
"user_name": "Diana K.",
..., #More information from this user
"projects": [
{
"project_name": "project_1"
"role": "Project Leader",
"category": "Business Intelligence",
},
{
"project_name": "project_4",
"role": "DataBase Manager",
"category": "Mobile Devices",
},
{
"project_name": "project_5",
"role": "Project Manager",
"category": "Web services",
}
]
}
这个结构的目的是将用户的所有信息添加到每个文档中,如果信息重复则无关紧要。例如,这样做可以让您恢复在特定项目中工作的所有用户,例如:
{
"query":{
"match": {
"projects.name": "project_1"
}
}
}
- 是的。与上面的查询一样,您可以通过“类别”字段匹配所有项目。但是,请记住,由于您的基础文档仅与用户相关,因此它将带回整个用户的文档。
在这种情况下,您可能需要使用Terms aggregation,它将为您带来某些字段的唯一值。这可以与查询“组合”。像这样:
{
"query":{
"match": {
"projects.category": "Mobile Devices"
}
}
},
"size", 0 #Set this to 0 since you want to focus on the aggregation's result.
{
"aggs" : {
"unique_projects_names" : {
"terms" : { "field" : "projects.name" }
}
}
}
最后一个查询将在聚合字段中返回所有具有“移动设备”类别的唯一项目名称。
- 您可以创建一个新索引来存储与您的项目相关的所有信息。但是,用户和项目之间的关系不容易保持(请记住,ES 不适合作为结构化数据库或 ER DB,如 SQL)并且查询将变得非常复杂,即使您决定将两者都命名为索引(用户和项目),您可以使用通配符调用它们。
编辑:另外,您可以考虑将与您的项目相关的所有信息存储在 Postgress 中并单独进行调用,首先从 ES 获取项目 ID(或名称),然后从 Postgres 获取项目的信息(因为我假设可能是更可能不会改变的信息)。
希望这有帮助! :D