码迷,mamicode.com
首页 > 其他好文 > 详细

elasticsearch 实现N抽二

时间:2017-08-12 10:12:21      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:实现   elasticsearch   抽二   

在实际搜索中,如果商家信用良好,那有可能搜索的结果前几条都是该商家的,这样会引起其他商家的不满,因此需要干预一下排序,使每页一个商家最多显示两条商品。俗称N抽二,这在淘宝,天猫也是有此规则的。

在elasticseasrch中,对外暴露的接口不多,想了几天,最终采用elasticsearch 自带的聚合功能来实现,具体参见

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-scripted-metric-aggregation.html。


具体:

InitScriptFactory 初始化一个队列

MapScriptFactory 将商品ID, 商家ID, 分数放入队列

CombineFactory  对每个商家取top100,合并所有商家,再排序,并返回top1000

ReduceScriptFactory 对所有分片的数据进行排序,然后N抽二,默认20个桶,将所有数据往这个20个桶里放,如果发现这个桶已经满了,找下一个桶,否则,如果发现该桶内已有该商家的两个商品,也找下一个桶,否则可以放到这个桶内。对于那些没有放到任何桶内的商品,放到一个备用桶内,为后续的补位预留(有可能到最后有的桶没有满)。

这样就实现了N抽二的简单逻辑。当然这可能不是最优的方案,但是勉强能实现功能。


elasticsearch 实现N抽二

标签:实现   elasticsearch   抽二   

原文地址:http://12597095.blog.51cto.com/12587095/1955537

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!