gpt4 book ai didi

elasticsearch - 在ElasticSearch中查询多对多映射

转载 作者:行者123 更新时间:2023-12-02 22:22:25 25 4
gpt4 key购买 nike

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

产品-存储所有产品信息

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

所有者-与所有者X(CSV)一起存储所有产品
{
"OwnerId":"o-id1",
"Products":"P1,P2,P3,...,Pn"
}

注意:
  • 一个产品可能有多个所有者。
  • 一位所有者可以处理多种产品

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

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

  • 最佳答案

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

    问题是,您真的需要将产品的所有 Realm 都保留在这里吗?您只能复制搜索字段。通常,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为什么这是一半的度量(因为您不能在一个索引中具有父级,而在另一个索引中不能具有子级)。

    关于elasticsearch - 在ElasticSearch中查询多对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49727578/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com