对于电子商务平台,我们正在寻找索引产品。默认字段很简单:name_en
,name_de
,name_fr
,description
。但是,价格和库存取决于另一个价值:
Product A
,webshop 1
有price = 1.99
,stock = 10
,并且符合类别1,10和50。Product A
,webshop 2
,price = 5.99
,stock = 5
和类别9,90和500。我在考虑嵌套对象,但这是一个选项吗?
- name_en: Product A
- description_en: Product A description
- webshops: [{
- key: webshop_id
value: 1
- key: price
value: 1.99
- key: stock
value: 10
- key: categories
value: [1, 10, 50]
},{
- key: webshop_id
value: 2
- key: price
value: 5.99
- key: stock
value: 5
- key: categories
value: [9, 90, 500]
}
]
这样容易查询吗?我们是否可以轻松获取整个文档,其值为webshop.key.webshop_id.value = 1
或webshop.key.categories.value = 500
?
我的想法是错误的,是否有正确的指示?
答案 0 :(得分:1)
您可以像往常一样进行嵌套,但是在单个网上商店中更新产品的价格或库存会变得很困难,因为您必须重新索引整个webshops
数组。有很多方法可以解决它,但这很复杂。
您可以对网店零件进行非规范化,只需在文档中包含price
,stock
和categories
字段,而不是嵌套结构。
Document 1:
- name_en: Product A
- description_en: Product A description
- webshop_id: 1
- price: 1.99
- stock: 10
- categories: [1, 10, 50]
Document 2:
- name_en: Product A
- description_en: Product A description
- webshop_id: 2
- price: 5.99
- stock: 5
- categories: [9, 90, 500]
然后,在您的查询中,您可以简单地为webshop = 1
或webshop = 2
(或两者)添加约束,具体取决于您要查询的网店。更新特定商店中产品的价格,库存和类别也更容易,您只需更新相应的文档。
这意味着您的产品数据(名称,描述等)将在每个网上商店复制一次,但这通常不是什么大问题(在NoSQL世界中很常见),您只需要更新2个文档而不是一个,但_bulk
将有助于那里。至少,当您添加新的网上商店时,您不需要重新索引所有数据(!!!)并且您在一家网店中更改价格和库存而不会干扰其他网站。
答案 1 :(得分:1)
您还可以使用父/子关系功能。
您必须定义两种文档类型:product和webshop
在映射中,您必须定义如下关系:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-parent-field.html
{
"webshop" : {
"_parent" : {
"type" : "product"
}
}
}
就像那样,您可以索引产品类型中的所有产品。然后,您可以索引与产品相关的所有网上商店详细信息。
您可以使用查询/过滤器来检索与产品相关的网上商店详细信息。
就像那样,您可以单独查询真正不同的文档。