【问题标题】:Querying many to many mapping in ElasticSearch在 ElasticSearch 中查询多对多映射
【发布时间】:2018-09-18 12:50:56
【问题描述】:

我的 ElasticSearch 索引中有两种类型。

Product- 存储所有产品信息

{
   "ProductId":"P1",
   "Name":"Refrigerator"
}

所有者 - 以所有者 X (CSV) 存储所有产品

{
   "OwnerId":"o-id1",
   "Products":"P1,P2,P3,...,Pn"
}

注意:

  1. 一个产品可能有多个所有者。

  2. 一个所有者可以处理多个产品

现在,构建一个查询来检索有关特定所有者的所有产品的信息。我首先查询所有者类型并获取所有产品 ID,然后我查询产品类型并使用术语查询传递获得的产品 ID。但这使得查询非常慢,因为产品的数量可能非常高(100,000)。另外,我想避免两个查询。

有没有更好的方法可以对这两种类型进行建模以便查询更快?

【问题讨论】:

标签: elasticsearch


【解决方案1】:

根据https://discuss.elastic.co/t/how-to-handle-many-to-many-relationships/47864 和许多其他资源,您的用例更适合传统 SQL 解决方案。如果你真的必须为此使用 ES,那么复制就是解决方案。根据您的用例,我相信拥有一个包含所有者 ID 作为文档 ID 的索引和一个包含所有产品的字段(或嵌套字段)。

问题是,您真的需要将产品的所有字段都保留在这里吗?您只能复制搜索字段。一般来说,ES 不适合作为主存储解决方案。在 ES 中,您只保留您搜索的字段(以一种无法避免重复的形式,并且因其性能优势而受到欢迎),然后您拥有一个主存储解决方案(传统 sql),这是您想去的地方检索所有用于演示的字段(当然,您要与 ES 保持同步)。

如果你不能这样做,这意味着你需要将所有数据存储在 ES 中,那么重复也是答案,但你可以进行一些优化以提高索引的大小(例如,不要分析字段您不搜索或通过完全匹配搜索 - 关键字类型,如果您使用的是默认启用的版本等,则禁用 _all 字段。

另一个可能的解决方案可能是这个功能https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html。检查一下,看看你是否可以让它为你工作。这是完成一对多功能的方法,所以我再次相信通过一些重复你可以实现想要的。阅读此https://discuss.elastic.co/t/can-we-give-parent-child-relation-ship-between-different-indexes/25872/2 为什么这是一个一半的措施(因为您不能将父级放在一个索引中,而将子级放在另一个索引中)。

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多