【问题标题】:Modeling parent/child relationships (product/productvariant) in Elasticsearch在 Elasticsearch 中建模父/子关系(产品/产品变体)
【发布时间】:2012-12-21 04:46:43
【问题描述】:

在使用 ES(或 Solr)建模产品变体时让我头疼

考虑(人为的例子):

  • 不同的产品(比如 T 恤)
  • 每个产品都有一组属性(productid、name、desc、brand、color、popularity)
  • 每个产品都有一组具有属性(productvariantid(productid++size 的组合)、productid、size、availability、price)的productvariant

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

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

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

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

  • C.按价格过滤。

  • D.过滤产品的某些属性

  • E.按价格下单

  • F.按产品属性排序,例如受欢迎程度,或两者的组合。

  • G. productvariant.price 的方面

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

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

但是,FH 怎么样?我已经研究了 _scope 的方面(尽管我承认我没有 100% 了解可能性)和所有其他想到的东西,但我没有看到一个明显的解决方案来显示产品属性的方面并能够与 has_parent 一起按它们进行排序。

我尝试过其他的东西(在纸上) - has_child -> 没有运气需要返回变体信息 - 嵌入式文档(产品内部的变体)并返回具有所有变体的整个产品。只是感觉很笨拙。此外,我很确定我不能以这种方式考虑/订购价格。

帮助非常感谢

【问题讨论】:

标签: elasticsearch


【解决方案1】:

我在墙上撞了很长时间,试图让类似的方案奏效。我的方案是产品/供应商关系(多个供应商销售的单一产品,可能不同的描述/价格/可用性)。

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

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

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

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

【讨论】:

  • 同意挑战!在您的情况下,您将如何按价格对产品进行排序(在供应商索引中?),因为无法限制返回的产品 ID,因为无法事先知道它们将如何按价格排序,对吗?所以换句话说,您对 Product 的第一个查询需要返回所有匹配的产品 ID 以在第二个查询中查找订单,恕我直言,这似乎效率很低?
  • 最不烦人的方法就是对数据进行非规范化。当供应商价格发生变化时,我会更新供应商文档,然后使用“最低价格”字段更新产品文档。我可以根据最低价格字段进行排序,而无需进行其他查询。我来自强大的关系 DBM 背景,所以这需要一些心理体操来适应。或者,您可以按相关性排序,获取前 100 名,查询价格,然后根据价格(在 ES 之外)处理结果。人们通常想要“与我的查询仍然相关的最低价格”,所以它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多