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 数据库。虽然这可能比通过电影索引单独查询它们要慢?

您要查找的是父子关系类型。

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

  1. 您可以根据影院文件的条件搜索电影。例如:给我所有在印度影院上映的电影。 LINK - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-parent-query.html
  2. 您可以根据电影搜索影院,例如:给我所有上映电影 "back to the future" 的影院。 LINK - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-child-query.html

您可以找到更多关于亲子的信息here

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

  1. 您可以 edit/update 电影文档而无需触及影院信息。
  2. 您可以 add/delete/edit 影院文档而无需触及电影信息