运营了一个模版下载网站,之前根据查看详情、下载、收藏等交互维护了模版的热度,但是发现并不是很“人性化”,因为点击的越多的模版永远霸榜了,一些其他的优质模版几乎很难再出现在首页,所以打算更换算法,可以更加人性化的展示真正的优质模版~
算法选择
基于Hacker News的内容热度推荐算法
库表设计
模版表原来维护的hot字段,现在增加hot_score维护热度分值
增加一个维护一周内模版交互的记录表
热度计算及维护
参数解释:
Hinit : 初始热度值,这里我们直接用的原模版的hot热度
Hinteract:互动热度值,我们取一周内交互的热度和
Htime:时间衰减因子,这里取7*24。
G:重力因子,它决定了热度随时间下降的速度,前期平台人员较少时,相对应得发的资源也会比较少,这时可以把G调小一点,减缓时间推移对热度下降的影响,后期平台人员增多时,相对应的资源也会增加,这时可以把G调大一点,加速时间推移对热度下降的影响。比如:1.2-1.8
Hweight: 加减权重,初始值可以为0,在某些偶然或者极端情况下需要人为干预的时候,可以动态调整其值,使其能够及时的控制其热度。
/**
* @param hInit 初始热度值,可以以用户活跃度来衡量,比如以积分的形式
* @param hInteract 互动热度值,根据用户行为数据来衡量
* @param hTime 时间衰减因子,也就是从提交到现在的时间(以小时计),加2是为了防止最新发表的会导致分母过小 ,这个值可调,在前期平台人数较少时调整大一些,在后期人数增长起来后,可以调整的小一些,比如,因为用户对平台资源有一个消化时间。
* @param g 重力因子,它决定了热度随时间下降的速度,前期平台人员较少时,相对应得发的资源也会比较少,这时可以把G调小一点,减缓时间推移对热度下降的影响,后期平台人员增多时,相对应的资源也会增加,这时可以把G调大一点,加速时间推移对热度下降的影响。比如:1.2-1.8
* @param hWeigh 加减权重,初始值可以为0,在某些偶然或者极端情况下需要人为干预的时候,可以动态调整其值,使其能够及时的控制其热度。
* @Author l'amour solitaire
* @Description Hacker News的内容热度推荐算法
* @Date 2022/6/28 下午10:48
**/
public static Double resourceHot(Integer hInit, Integer hInteract, Integer hTime, Double g, Integer hWeigh) {
return (hInit + hInteract) / Math.pow((hTime + 2), g) + hWeigh;
}
理想的方式是有交互的时候更新当前模版的热度,同时定时任务执行全局重新计算,但是这个项目我们不打算运用定时任务,所以最终我的的方式是有交互的时候更新当前模版的热度,同时加上热点的排序,如下
lastSql.append(" ORDER BY hot_score DESC,hot DESC");
也就是基于hot和hot_score进行排序,通过用户操作来更新实时数据,未更新的以hot来排序,同时删除7天前的热点数据,省略了定时任务
实现效果 DOWN源码