处理Elasticsearch中多对多关系的最佳实践?

时间:2014-10-29 20:18:34

标签: elasticsearch

我很确定我知道这个问题的答案,但我正在寻找具有更多Elasticsearch经验的人的确认。

假设我有一个包含作者和书籍的数据库。作者可以与0本或更多书籍相关联,并且书籍可以与1个或更多作者相关联。我们希望用户能够搜索作者姓名以查找作者及其所有书籍,并且我们还希望他们能够搜索书名以取回其作者。我们知道会有很多多作者的书籍。

因为Elasticsearch只直接支持一级父子关系,并且因为子级只能有一个父级,所以在我看来,我们需要对数据进行非规范化并使用嵌套对象来建立这种关系。如果我们修改已发布23本书的作者的属性,我们将需要重新索引作者记录和他/她的所有23本书记录。

在我的幻想世界中,我希望这23本书都包含一系列作者ID,以便在重新索引作者时我不必重新索引书籍。看来这肯定可以使用Elasticsearch的父子支持如果一本书只能有一个作者,但由于多对多的要求,我必须使用嵌套对象并重新索引任何任何变化时相关的对象。

这是对的吗?它看起来似乎更多的工作(当然还有更多的更新),但我想以正确的方式做到这一点,而不是引入复杂性,错误和疯狂的“聪明”方式。

任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:5)

根据您的问题,我可以放心地假设ES不会是您的主要数据存储。因此,关于如何使你的多对多关系去规范化的主要问题是弄清楚"如何&什么"你会用ES吗?这就是您期望构建的查询。

思考"查询命令"因此设计和反规范化。以下是一些指示:

  • 将书籍中的作者ID非正常化:您希望用户执行搜索,例如"所有书籍都是针对userId = XYZ"。如果没有,您宁愿将作者的名称作为书籍文档中的多字段
  • 重复,复制和复制。弄清楚哪些数据将被大量更新(作者,因为书籍一般在出版后不会获得作者)。将作者归化为书籍(最有可能的名字)。复制(进入另一种文档类型)类似" author_books"这将是一个作家的孩子和支持更新经常更新(再次,从作者的角度去标准化标题和其他相关的东西)。

希望这有一定意义;)