电子商务和Vespa:过滤客户的愿望清单



假设一个电子商务网站有愿望列表功能。有些用户的愿望清单很多(以数万计)。产品总量以百万计。我们希望实现这样的功能:客户可以像在目录中那样过滤那些产品。

当我们考虑使用Elasticsearch实现这一点时,我们发现最好的方法是使用术语查找。例如,我们为每个用户的愿望列表创建一个文档,然后使用该文档过滤出我们需要的产品。在那之后,所有的过滤等都是有规律地完成的。这里的问题是Elasticsearch不能正确地对这些产品进行排序——即文档如何指定它,因为我们想按愿望列表时间排序。

这就是我决定调查Vespa的时候。但在阅读文档后,我仍然不知道什么是最好的方法来实现这一点。这看起来像是一个需要"加入"的问题。在我被感染了rdbms的脑子里:)

数据基数如下:

  • 百万级产品
  • 数十万用户
  • 数以万计的愿望清单

所以…有什么想法如何实现或指针读什么?

在Vespa中,您需要两种文档类型(如果您想在Vespa中存储愿望列表,也就是说,这不是必需的)

  • 从Vespa使用Vespa的get api或从其他存储解决方案检索给定用户的whislist。
  • 在产品id字段上使用DotProductItem以及排名配置文件检索和排名。
/search/?yq=select * from products where dotProduct(product_id, {"a":3, "b":2});&ranking=wishlist&hits=10

在本例中,a是一个比b更近期的产品,排名配置文件与之配套:

rank-profile wishlist {
first-phase {
expression:rawScore(product_id)
}
}

你也可以使用WAND来加速搜索,只检索愿望列表中最近的/排名最高的命中。上面的示例检索所有并对所有进行排序。

  • https://docs.vespa.ai/en/reference/query-language-reference.html
  • https://docs.vespa.ai/en/using-wand-with-vespa.html

您可以通过使用WeightedSet项来做到这一点,其中项令牌是产品的id,权重是您想要排序的时间戳,请参阅https://docs.vespa.ai/documentation/reference/query-language-reference.html#weightedset或参阅https://docs.vespa.ai/documentation/multivalue-query-operators.html#weightedset-example在搜索器中创建它(推荐)。

根据时间戳进行排名,使用仅根据匹配权重进行排名的排名配置文件,例如attributeMatch(name).totalWeight

(关于排序,您还可以在Searcher中检索所有匹配项,使用代码,删除下面的匹配项,然后用摘要数据填充()。只要你在填充前做这个操作,它就可以缩放到几十k。

最新更新