'Associated' ElasticSearch 中的数据
'Associated' data in ElasticSearch
对于电子商务平台,我们正在寻找索引产品。默认字段很简单,如: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
?
我的想法有误吗,有没有正确方向的指示?
您可以像以前那样嵌套,但是在单个网上商店中更新产品的价格或库存会变得很困难,因为您必须重新索引整个 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
会有所帮助。至少,当您添加新的网上商店时,您不需要重新索引所有数据 (!!!) 并且您可以在不干扰其他网上商店的情况下更改一个网上商店的价格和库存。
您还可以使用 parent/child 关系功能。
您必须定义两种文档类型:产品和网上商店
在映射中,您必须这样定义关系:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-parent-field.html
{
"webshop" : {
"_parent" : {
"type" : "product"
}
}
}
这样您就可以索引该产品类型中的所有产品。然后您可以索引与该产品相关的所有网店详细信息。
您可以使用 query/filters 检索与产品相关的网上商店详细信息。
就像你有真正不同的文件可以单独查询。
对于电子商务平台,我们正在寻找索引产品。默认字段很简单,如: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
?
我的想法有误吗,有没有正确方向的指示?
您可以像以前那样嵌套,但是在单个网上商店中更新产品的价格或库存会变得很困难,因为您必须重新索引整个 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
会有所帮助。至少,当您添加新的网上商店时,您不需要重新索引所有数据 (!!!) 并且您可以在不干扰其他网上商店的情况下更改一个网上商店的价格和库存。
您还可以使用 parent/child 关系功能。
您必须定义两种文档类型:产品和网上商店
在映射中,您必须这样定义关系:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-parent-field.html
{
"webshop" : {
"_parent" : {
"type" : "product"
}
}
}
这样您就可以索引该产品类型中的所有产品。然后您可以索引与该产品相关的所有网店详细信息。
您可以使用 query/filters 检索与产品相关的网上商店详细信息。
就像你有真正不同的文件可以单独查询。