在Elasticsearch中建模父/子关系(product / productvariant)

时间:2012-12-20 14:26:49

标签: elasticsearch

使用ES(或Solr就此问题)对产品变形进行建模

考虑(人为的例子):

  • 不同的产品(比如T恤)
  • 每个产品都有一组属性(productid,name,desc,brand,color,popular)
  • 每个产品都有一组具有属性的产品变量(productvariantid(productid ++大小的组合),产品,尺寸,可用性,价格)

这似乎是产品和产品变量之间的标准父/子关系。所以我想像ES那样建模。

我希望能够做到以下几点:

  • 一个。查询productvariants(并返回所有属性)。无需返回产品属性,产品变量属性就足够了。

  • B中。每个用户查询都受到约束,因此每个产品最多匹配1个产品变量(在上面的示例中,这意味着我们约束productvariant.size)

  • ℃。过滤价格。

  • d。过滤产品的某些属性

  • 电子。价格订购

  • F。订购产品的财产,如人气,或2的组合。

  • -G。 facet on productvariant.price

  • 小时。关于产品的多个属性(父母)的方面

使用父/子文档和ES中的has_parent执行此操作: A-E + G 是可能的。

然而, F H 怎么样?我已经将_scope作为方面进行了调查(虽然我不确定100%的可能性)和所有其他想到的东西,但我没有看到显示产品方面的明显解决方案-properties并能够与has_parent一起排序。

我尝试了其他的东西(纸上)   - has_child - >没有运气需要返回变量信息   - 嵌入式文档(产品内部变体)并返回包含所有变体的整个产品。它只是感觉笨重。而且我很确定我不能以这样的价格面对/订购。

非常感谢

1 个答案:

答案 0 :(得分:3)

我把头撞在墙上很长一段时间试图让类似的计划工作。我的方案是产品/供应商关系(由多个供应商销售的单个产品,可能有不同的描述/价格/可用性)。

Parent-> ES中的子映射现在不是很强大或易于使用。即使你得到了一些有用的东西,你也会很快遇到边缘情况,因为ES不支持边缘情况。

我认为您最好的选择是自己管理parent->子映射,并将文档存储在自己的索引中。产品具有ID,然后将其作为Product_ID存储在ProductVariant文档中。这实际上是ES无论如何在内部存储父 - >子关系的方式。

在实践中,您查询“顶级”索引(产品),然后使用Product_ID字段上的过滤器对ProductVariant的索引执行第二次查询。

维护起来有点麻烦但是更灵活。至少在ES获得更好的Parent-> Child能力

之前