我们有一家在线商店,该商店将产品详细信息存储在三个表中:
总共约有400.000个项目。
示例:
- 产品为“ Nike Air Max”
- 变量为“ 36号,70美元”,“ 37号,72美元”,“ 38号,74美元”
- 属性为“红色”和“黑色”
- 总共6种组合(“ Nike Air Max + 36 +红色”,“ Nike Air Max + 36 +黑色” ...)
我正在寻找一种以弹性方式存储元素以获取最佳过滤器性能的方法,例如“ 将所有尺寸为34-37的产品提供给红色或橙色的查询,则费用低于90美元”
我应如何在Elasticsearch中反映此设置,即应创建哪些索引以获得最佳搜索和过滤器性能(索引性能并不重要)
注意:我见过像“非规范化”,“嵌套文档”和“子文档”之类的关键字,但不确定我应该阅读和实施哪种方法。
答案 0 :(得分:2)
您有2种方法可以做到这一点
类似
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" }
。
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红色的文档。