【问题标题】:What is the best way to manage relations in ElasticSearch?在 ElasticSearch 中管理关系的最佳方式是什么?
【发布时间】:2015-08-12 15:47:41
【问题描述】:

很抱歉,如果有人问过这个问题,但我找不到关于这个问题的明确答案。

我在创建 elasticsearch 索引时遇到了问题,我不确定如何正确管理关系。

假设我有以下实体:

  • 产品
    • 身份证
    • 参考
  • 图书
    • 身份证
    • 姓名
    • product_id
  • 衬衫
    • 身份证
    • 颜色
    • product_id
  • 库存项目
    • 身份证
    • supplier_id
    • product_id
    • 数量

我愿意:

  • 从衬衫的颜色中寻找衬衫
  • 查找由供应商 ID 5 提供的所有书籍

我找不到我是否应该执行多个查询、嵌套对象、父/子关系等...我找不到合适的教程说“这样做”。

实际上我正在使用嵌套对象,但我发现在我的每种类型中重新定义我需要的所有数据是很脏的。

您对此有什么建议吗?

谢谢。

【问题讨论】:

  • 为什么不直接将supplier_id 存储到book 索引/类型中?

标签: symfony elasticsearch foselasticabundle


【解决方案1】:

在 Elasticsearch 中搜索和建模关系的关键是去规范化。这是因为 Lucene 有一个平面数据模型,没有内置对数据关系的支持。

从搜索结果的角度考虑。正在搜索的东西是什么?您的搜索结果中会显示什么?那就是你正在寻找的东西。如果您想根据相关对象中的值过滤或排序这些内容,则需要在索引时提取这些值。

如果您正在搜索衬衫并希望按颜色过滤,那么您的衬衫文档上都应该有一个color 字段。如果您正在搜索图书并希望过滤到某个供应商,那么您应该在图书文档中包含供应商名称或 ID 作为字段。

您选择的语言和 ES 客户端可能会使这更容易。例如,在 Ruby 中,您可以索引任意方法调用的结果,从而在索引数据的同时从其他关联模型中动态获取。

【讨论】:

    【解决方案2】:

    嵌套结构或父子关系是您最好的选择。我希望这个blog 会有所帮助。

    【讨论】:

    • 不知道为什么你被否决了,因为父子是 ES 中的一种非规范化,并且适用于许多类似的场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多