【问题标题】:How to store shop products in Elasticsearch如何在 Elasticsearch 中存储商店产品
【发布时间】:2019-03-21 15:29:40
【问题描述】:

我们有一个在线商店,将产品详细信息存储在三个表格中:

  1. 产品(名称、描述、品牌) - 共 10.000 个条目
  2. 产品变体(尺寸、价格、可用性) - 总共 80.000 个条目
  3. 产品属性(颜色) - 总共 60.000 个条目

这给出了大约 400.000 个项目的总组合。

例子:

  • 产品是“Nike Air Max”
  • 变体为“36 号 70 美元”、“37 号 72 美元”、“38 号 74 美元”
  • 属性为“红色”和“黑色”
  • 共有 6 种组合(“Nike Air Max + 36 + 红色”、“Nike Air Max + 36 + 黑色”...)

我正在寻找一种将元素存储在弹性中以获得最佳过滤性能的方法,例如“给我所有尺寸为 34 - 37 的产品,颜色为红色或橙色,成本低于 90 美元"

我应该如何在 Elasticsearch 中反映这种设置,即我应该创建哪些索引以获得最佳搜索和过滤性能(索引性能并不那么重要)

注意:我看到过诸如“非规范化”、“嵌套文档”和“子文档”之类的关键字,但不确定我应该更多地阅读和实施哪种方法。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    你有两种方法可以做到这一点

    1. 按鞋类(=产品)创建一个文档,每个鞋都将存储有关该产品的所有信息。这将最大限度地减少集群中的文档数量。

    类似

    shoes
        "name":    { "type": "keyword"  }, 
        "brand":     { "type": "keyword"  },  
        "Description": {
            "type":     "string",
            "index":    "not_analyzed"
        }
    
        nested:
            variant:
                size: { "type": "integer" },
                price: { "type": "float" },
                availability: { "type": "integer" },
                colors: { "type": "keyword"  }
    
    1. 用鞋子创建一个文档,你会有很多文档。

    .

    shoes
        "name":    { "type": "keyword"  }, 
        "brand":     { "type": "keyword"  },  
        "Description": {
            "type":     "string",
            "index":    "not_analyzed"
        }
    
        size: { "type": "integer" },
        price: { "type": "float" },
        availability: { "type": "integer" },
        colors: { "type": "keyword"  }
    

    如果您必须像您所说的那样使用查询,那么第二种解决方案会更好(您不必过滤嵌套字段,统计或聚合将很容易,并且 400k 项对于弹性搜索将很容易),如果您正在寻找为网站做一个搜索引擎我认为这更好。如果您需要通过“产品”制作统计数据或后台工具,第一个模型可能会更好。

    【讨论】:

      【解决方案2】:

      (鼓声...)这取决于! 为了更具建设性,这取决于您希望如何获取这些产品。如果您想专门搜索 40 号的红色,您可能需要嵌套文档。 这是一个简短的例子:

      {"name":"Air max", variants: [{color:"red", size:"36"}, {color:"black", size:"40"}]}
      

      现在,如果我们认为变体是嵌套文档,并且您仍在寻找大小为 40 的红色,那么 ES 将正确返回 0 个结果。

      如果没有嵌套文档,内部索引将如下所示:

      {"name":"Air max", variants.color:"red" "black", variants.size:"36" "40"}
      

      使用这种数据结构,ES 会返回一个大小为 40 的红色文档。

      【讨论】:

      • 现在如果你真的想使用嵌套文档,请注意它在性能、与 ES 相关的不同软件的兼容性方面存在一些缺陷(看着你,Kibana),...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2017-02-13
      相关资源
      最近更新 更多