【问题标题】:Design modeling of association within types in ElasticSearchElasticSearch 中类型内关联的设计建模
【发布时间】:2014-03-26 20:55:07
【问题描述】:

我正在使用 ElasticSearch 在我的应用程序中进行搜索。

我们需要做的一件事是有一种方法来存储不同 ElasticSearch 类型之间的任意关系。

假设我们在ElasticSearch索引中有三种类型如

“客户”、“生活方式”和“电影流派”。

假设用户想为一个客户关联多个生活方式,发生的情况是用户在应用程序中指定映射,而在 ElasticSearch 中采用 "customer" 的 docId,"lifestyle" 的 docId,并将其放入存储 docid 对并存储关联的 "Mapper" 类型中键入文本(“cutomerToLifeStyle”)。

以类似的方式,customermoviegenre 之间的关联将插入 customer 和 moviegenre 的 docId 对以及关联类型文本,例如 (" customerToMovieGenre”)。这个想法是在这个 "Mapper" 类型中整合类型之间的任何类型的任意关系。

这可能是解决问题的一种简单的方法,但有人认为这种方法有什么问题吗?

【问题讨论】:

    标签: search elasticsearch mapping model-associations


    【解决方案1】:

    纯粹从设计的角度来看,我还会选择“映射器”类型,它通过存储两个文档的 id 而不是例如链接两个文档。在“客户”文档中列出“电影流派”的 ID。但是,我将为每个关系引入一个单独的“映射器”类型。 (即“CustomerToLifeStyle”类型和“CustomerToMovieGenre”类型。)原因是您可能会在特定于关系的映射器文档中存储其他数据。假设您想存储客户对某种类型的电影的评价程度。此信息在客户与生活方式的关系中没有意义。您希望在映射器文档中存储的附加数据越多,您就会看到“CustomerToLifeStyle”数据和“CustomerToMovieGenre”数据变得不同。因此,为每个关系使用不同的类型可以让您的设计保持美观和整洁。

    【讨论】:

    • 我最终创建了 Mapper 类型。看来我的“加入”正在工作。我认为最好有一个由 RDBMS(在弹性搜索之上)支持的“连接”服务来处理不同实体之间的任何复杂连接要求。这增加了应用程序的表面积,但从长远来看可能更易于维护。
    【解决方案2】:

    如果你想在elasticsearch中建模这种关系,你应该使用elasticsearch中的核心概念之一的父/子关系:

    http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/

    这种方法的优点是您可以使用标准方法来遍历关系并构建查询。如果您使用自己的方法,那么您必须在代码中手动进行连接和查找。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多