一尘不染

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

elasticsearch

打破我的造型productvariants头使用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中执行此操作。

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

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

帮助非常感谢


阅读 286

收藏
2020-06-22

共1个答案

一尘不染

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

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

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

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

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

2020-06-22