elasticsearch:保留冗余(非规范化)数据或保留 id 列表以进行交叉引用
elasticsearch: Keep redundant (denormalized) data or keep a list of ids for cross-referencing?
将冗余数据存储在一个索引中更好,还是有两个索引然后交叉引用它们更好? 即,用户想要在影院查找电影。
由于用户有兴趣按影院查找电影,因此我们可以nested_type电影中获得影院索引:
// Here, movies field will be a Nested Type, not Object Type.
eclient.index({
index: 'myindex',
type: 'theater',
id: 1,
body: {
name: "Grand Cinema",
description: "Come watch movies!",
movies: [
{
title: "Red November",
description: "A submarine hunt",
rated: "R",
score: 10.0
},
{
title: "Cinderbrella",
description: "A burnt umbrella",
rated: "PG",
score: 8.8
}
]
}
});
这使得按影院显示电影的简短列表变得容易,因为数据在影院上是非规范化的。
我们还可以有一个电影索引,其中包含有关电影的更多详细信息:
eclient.index({
index: 'myindex',
type: 'movie',
id: 1,
body: {
title: "Red November",
description: "A submarine hunt",
rated: "R",
score: 10.0,
actors: ["Bob", "Alice", "Carol"],
// other details...
}
});
因此,当用户点击电影以获取更多信息时,我可以查询电影索引并获取其详细信息(即演员)。
如您所见,剧院拥有大量冗余数据。如果电影获得更新的字段,重新索引也会很痛苦。将有两个地方可以重新索引:影院索引中的电影和电影索引本身。即,电影获得更新的分数。
我想我可以更改它,以便影院索引包含一堆电影 ID,并让电影包含一堆影院 ID:
// theater index
type: 'theater',
id: 1,
body: {
name: ...
description: ...
movies: [ 1, 2 ]
}
// movie index
type: 'movie',
id: 1,
body: {
title: ...
description: ...
theaters: [ 1, 2, 3]
}
但是在这种情况下,我将如何有效地从影院查询电影信息?我必须获取电影 ID,然后在电影索引上逐个查询它们,只是为了获取一些有限的电影信息以显示在影院页面上。但是,如果特定电影的字段发生更改,则重新编制索引的工作就会少得多。
哪个是更好的解决方案?我更倾向于认为后者,因为即使电影很少改变其数据,重新索引每个拥有该特定电影的影院并重新索引电影索引本身也可能是计算能力的巨大浪费(瓶颈?
第三种解决方案是让影院保留电影 ID,然后查询这些 id 上的 Postgres 数据库。尽管这可能比通过电影索引单独查询它们慢?
您要查找的是父子关系类型。
在同一索引下,你可以将一种类型定义为另一种类型的父级。在这种情况下,您可以将所有电影文档保留在电影类型中,将影院文档保留在影院类型下。这种方法的优点是
- 您可以根据影院文档的条件搜索影片。例如:,给我所有在印度影院上映的电影。链接 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-parent-query.html
- 您可以根据电影搜索剧院,例如:,给我所有上映电影"回到未来"的剧院。链接 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-child-query.html
您可以在此处找到有关亲子的更多信息
父子关系相对于嵌套文档的优势
- 您可以在不接触影院信息的情况下编辑/更新电影文档。
- 您可以在不接触电影信息的情况下添加/删除/编辑影院文档
- 我创建了一个Javascript待办事项列表,但想知道如何在浏览器刷新后保留这些帖子
- 在可排序的JQuery UI列表中至少保留一个项目
- 保留动态创建的下拉列表's在事件窗口.history.back()上选择的值-JavaScript
- 更改URL并保留“更改”事件下拉列表中的值
- jQuery如何在页面重载时保留动态创建列表的选定选项
- 保留选项列表以供选择
- AngularJS不保留表单中复选框列表中的选定项
- 保留下拉列表的表单值
- elasticsearch:保留冗余(非规范化)数据或保留 id 列表以进行交叉引用
- 保留列表中移动元素的顺序
- 车把:在保留原始排序索引的同时对列表进行排序
- 是否可以在JS中获取保留字(变量,函数,对象名称)的列表
- 使用 javascript 将项目添加到下拉列表中并保留在回发中
- 剑道树列表绑定在行编辑时不会保留
- 我试图在流星中吐出我正在保留的数组的列表;不显示
- 回发后如何在下拉列表中保留所选值
- JQuery:将项目添加到列表并保留项目计数
- JavaScript 中的保留字列表
- 在城市下拉列表中保留值(第4部分)
- 剑道UI输入焦点-在选择和Ajax调用之后,下拉列表保留焦点