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

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

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

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

正如你所看到的那样,剧院里有很多冗余的数据。 如果电影获得更新的字段,也会使重build索引变得非常痛苦。 将有两个地方重新索引:影院索引和电影索引本身的电影。 即电影获得更新的分数。

我想我可以改变它,以便剧场索引拥有一堆电影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,然后在电影索引中逐一查询,以获得一些有限的电影信息以显示在电影院页面上。 但是,如果一个字段在某个特定的电影上发生变化,那么重新索引的工作就less了很多。

哪个更好的解决scheme? 我更倾向于认为后者,因为即使电影很less改变其数据,重新索引每个拥有该特定电影的影院 ,并重新索引影片索引本身可能是计算能力(瓶颈?)的巨大浪费。

第三种解决scheme是让剧院拥有电影ID,然后在这些ID上查询Postgres数据库。 虽然这可能比单独通过电影索引来查询它们要慢吗?

你正在寻找的是父子关系types。

在相同的索引下,可以将一个types定义为另一个types的父types。 在这种情况下,您可以将所有电影文档保存在影院types和影院文档中。 这种方法的优点是

  1. 您可以根据影院文档的条件search影片。 例如:给我所有在印度剧院发行的电影。 LINK – http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-parent-query.html
  2. 你可以根据电影search剧场,例如:给我所有的电影“回到未来”的电影放映。 LINK – http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-child-query.html

你可以在这里find关于父母孩子的更多信息

亲子关系嵌套文件的优点

  1. 您可以编辑/更新短片文件,而无需触摸剧场信息。
  2. 您可以添加/删除/编辑影院文件,而无需触摸影片信息