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

Joe*_* P. 14 elasticsearch

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

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

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

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

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

任何指导将不胜感激.

小智 6

根据您的问题,我可以放心地假设ES不会是您的主要数据存储.因此,如何对你的多对多关系进行非规范化的主要问题是弄清楚你将如何使用ES.这就是您期望构建的查询.

对"查询命令"设计的思考与相应的非规范化.以下是一些指示:

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

希望这有一定道理;)