'相关' ElasticSearch中的数据

时间:2015-06-03 09:48:37

标签: elasticsearch nested

对于电子商务平台,我们正在寻找索引产品。默认字段很简单:name_enname_dename_frdescription。但是,价格和库存取决于另一个价值:

    对于Product A
  • webshop 1price = 1.99stock = 10,并且符合类别1,10和50。
  • Product Awebshop 2price = 5.99stock = 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 = 1webshop.key.categories.value = 500

我的想法是错误的,是否有正确的指示?

2 个答案:

答案 0 :(得分:1)

您可以像往常一样进行嵌套,但是在单个网上商店中更新产品的价格或库存会变得很困难,因为您必须重新索引整个webshops数组。有很多方法可以解决它,但这很复杂。

您可以对网店零件进行非规范化,只需在文档中包含pricestockcategories字段,而不是嵌套结构。

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 = 1webshop = 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"
    }
  }
}

就像那样,您可以索引产品类型中的所有产品。然后,您可以索引与产品相关的所有网上商店详细信息。

您可以使用查询/过滤器来检索与产品相关的网上商店详细信息。

就像那样,您可以单独查询真正不同的文档。