在Elasticsearch中对父母/子关系(产品/产品变化)进行建模



使用ES(或Solr为此)折断我的头

考虑(人为的示例):

  • 不同的产品(例如T恤)
  • 每种产品都有一组属性(productid,name,desc,desc,brand,颜色,受欢迎程度)
  • 每种产品都有一组具有属性(productVariantId(Productid 尺寸的组合),尺寸),尺寸,可用性,价格)的产品变量。

这似乎是产品与productvariant之间的标准父母/子女关系。所以我想在Es。

中像建模一样建模

我希望能够做以下操作:

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

  • b。每种用户疑问都受到限制,因此每种产品中最多有1个产品变量匹配(在上面的示例中,这意味着我们限制了productVariant.size)

  • c。价格过滤。

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

  • e。订购价格

  • f。诸如受欢迎程度或2的组合的产品属性的订单。

  • g。product variant.price

  • h。产品(父)的多个属性

在ES中使用parent/child Documents和has_parent进行: a-e g 是可能的。

但是, f h 怎么样?我以_scope为方面的事物(尽管我诚然我没有100%的可能性)和所有其他想到的东西,但是我看不到明显的解决方案可以显示产品普通的方面,并且是能够与has_parent结合使用。

我尝试了其他事情(在纸上) - has_child->没有运气需要返回的变体信息 - 嵌入式文档(产品内部的变体),并使用所有变体返回整个产品。感觉很笨拙。此外,我很确定我无法以这种方式进行价格/订单。

帮助非常感谢

我很长一段时间以来将头撞在墙上,试图使类似的方案有效。我的计划是产品/供应商关系(多个供应商出售的单个产品,潜在的描述/价格/可用性)。

parent-> ES中的儿童映射现在不是很健壮或易于使用。即使您得到的东西有效,您也很快就会遇到边缘箱,这实际上是不可能的,因为ES不支持它。

我认为您最好的选择是自行管理父母 ->子女映射,并将文档存储在自己的索引中。产品具有ID,然后将其存储在product_id的productVariant文档中。实际上,ES无论如何都可以在内部存储父母 ->子女关系。

实际上,您查询"最高级别"索引(产品),然后在product_id字段上使用过滤器对产品变量的索引进行第二个查询。

维护要麻烦,但更灵活。至少直到ES获得更好的父>儿童功能

最新更新