一尘不染

在Elasticsearch中建模父/子关系(产品/产品变体)

elasticsearch

在使用ES(或Solr)对产品变量进行建模时,我的头脑破了

考虑(人为的例子):

  • 不同的产品(例如T恤)
  • 每个产品都有一组属性(产品编号,名称,描述,品牌,颜色,受欢迎程度)
  • 每个产品都有一组具有属性(productvariantid(productid ++ size的组合),productid,大小,可用性,价格的productvariant)

这似乎是产品与产品变体之间的标准父/子关系。因此,我想在ES中进行建模。

我希望能够执行以下操作:

  • A.查询产品变量(并返回所有属性)。无需返回product-properties,productvariant属性就足够了。

  • B.限制每个用户查询,以便每个产品最多匹配1个productvariant匹配项(在上面的示例中,这意味着我们限制了productvariant.size)

  • C.价格过滤。

  • D.筛选产品的某些属性

  • E.价格订购

  • F.订购产品的属性,例如受欢迎程度,或两者的结合。

  • G.关于productvariant.price的方面

  • H.产品(父级)的多种属性方面

可以使用父/子文档以及has_parent在ES: AE + G 中执行此操作。

但是, FH
呢?我已经研究_scope过方面(虽然我承认我并没有100%抓住可能性)和所有其他想到的东西,但是我没有看到一个明显的解决方案来显示方面的产品属性和能力与一起排序has_parent

我已经尝试了其他方法(在纸上)-has_child->运气不佳,需要返回变量信息-
嵌入式文档(产品内部变量)并返回具有所有变量的整个产品。感觉笨拙。此外,我很确定我不能以这种方式分面/订购价格。

帮助非常感谢


阅读 218

收藏
2020-06-22

共1个答案

一尘不染

我长时间地用力撞墙,试图使类似的方案起作用。我的计划是产品/供应商关系(多个供应商出售的单个产品,描述/价格/可用性可能不同)。

ES中的Parent-> Child映射现在还不是很健壮或易于使用。即使工作正常,您也会很快遇到边缘情况,这实际上是不可能的,因为ES不支持它。

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

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

维护起来比较麻烦,但灵活性更高。至少直到ES变得更好的“父级->子级”功能为止

2020-06-22