elasticsearch:保留冗余(非规范化)数据或保留一个id列表以进行交叉引用?

use*_*398 6 javascript denormalization node.js elasticsearch

将冗余数据存储在索引中还是有两个索引然后交叉引用它们会更好吗?即,用户想要在剧院查看电影.

由于用户有兴趣通过影院查看电影,我们可以使用电影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
           }
        ]

    }
});
Run Code Online (Sandbox Code Playgroud)

由于数据在影院上非规范化,因此可以很容易地通过影院显示电影的简短列表.

我们还可以有一个电影索引,其中包含有关电影的更多详细信息:

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...
    }
});
Run Code Online (Sandbox Code Playgroud)

因此,当用户点击电影以获取更多信息时,我可以查询电影索引并获取其详细信息(即演员).

正如您所看到的,剧院拥有大量冗余数据.如果电影获得更新的字段,它还会使重新索引变得很痛苦.重新索引将有两个地方:剧院索引中的电影和电影索引本身.即,电影获得更新的分数.

我想我可以改变它,以便剧院索引拥有一堆电影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]
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我如何有效地从影院查询电影信息?我将不得不获取电影ID,然后在电影索引上逐个查询它们,以获得一些有限的电影信息显示在影院页面上.但是,如果一个字段在特定电影上发生变化,那么重新编制索引的工作要少得多.

哪个更好的解决方案?我更倾向于考虑后者,因为即使电影很少改变其数据,重新索引拥有该特定电影的每个影院以及重新索引电影索引本身也可能是计算能力的巨大浪费(瓶颈?).

第三种解决方案是让影院保持电影ID,然后只在这些ID上查询Postgres数据库.虽然这可能比通过电影索引单独查询它们要慢一些?

Vin*_*han 2

您正在寻找的是父子关系类型。

在同一索引下,您可以将一种类型定义为另一种类型的父级。在这种情况下,您可以将所有电影文档保留在电影类型下,将剧院文档保留在剧院类型下。这种方法的优点是

  1. 您可以根据影院文档的条件搜索电影。例如: ,给我在印度影院上映的所有电影。链接 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-parent-query.html
  2. 您可以根据电影搜索影院,例如: ,给我所有上映电影《回到未来》的影院。链接 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-child-query.html

您可以在这里找到有关父母子女的更多信息

父子关系相对于嵌套文档的优点

  1. 您可以编辑/更新电影文档,而无需触摸影院信息。
  2. 您可以添加/删除/编辑影院文档,而无需触及电影信息