如何在Elasticsearch中存储产品

时间:2019-03-21 15:29:41

标签: elasticsearch

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

  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中反映此设置,即应创建哪些索引以获得最佳搜索和过滤器性能(索引性能并不重要)

注意:我见过像“非规范化”,“嵌套文档”和“子文档”之类的关键字,但不确定我应该阅读和实施哪种方法。

2 个答案:

答案 0 :(得分:2)

您有2种方法可以做到这一点

  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"  }

如果您要像您所说的那样使用查询,那么第二种解决方案会更好(您不必筛选嵌套字段,统计信息或聚合将很容易,并且400,000个项目对于Elasticsearch来说很容易),如果您希望为网站创建搜索引擎,我认为这更好。如果您需要通过“产品”制作统计数据或后台办公工具,则第一个模型可能会更好。

答案 1 :(得分:0)

(鼓声...)这取决于! 要更具建设性,这取决于您要如何获取这些产品。如果要搜索大小为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红色的文档。