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