这是一个创建于 3794 天前的主题,其中的信息可能已经有所发展或是发生改变。
不知道表述清楚了没有,主要是3方面的问题:
(1)计算活跃度
目前的想法暂时是这样的,在redis中以 "user:%d" % user_id 为键,通过hash的形式保存2项内容:
* activeness:活跃度
* activeness_update_time:活跃度更新时间
用户每次访问页面、发私信等,都进行活跃度的计算:
* 首先根据activeness_update_time距离现在的时长T,对activeness进行衰减处理,T越长衰减程度越大
* 然后,再让activeness += 某值(比如访问页面+1,发私信+2)
(2)结合活跃度以及其他的权重因子,对用户进行排序
在user表中增加一个字段order_value,最终的排序就依据这个东西。
有个要求就是活跃度的权重是30%,其他权重因子(比如用户信息完整度)的权重是70%,据此计算出最终的order_value。一般貌似是先归一化,然后再计算:
order_value = 0.3 * 归一化的活跃度 + 0.7 * 归一化的用户信息完整度
那活跃度这个上不封顶的东西,如何归一化呢?是不是需要构造某个y=f(x),然后满足f(0)=0,f(x→∞)=1呢?
(3)何时进行排序
个人的看法就是每天深夜的时候触发一次排序,计算出所有用户order_value。可以使用crontab、celery beat等实现周期性触发计算任务。
--------------------------------
以前没有遇到这种需求,只能瞎灯黑火地猜,所以真心求教各位V大,或者能分享一下相关的资料就太感谢了。
6 条回复 • 2014-05-11 12:42:28 +08:00
|
|
1
andyhu 2014-05-10 14:18:38 +08:00
为啥要用hash?elasticsearch可以搞定这种需求,把activeness和activeness_update_time做成field就可以了。加权重的话可以boost
|
|
|
2
hustlzp 2014-05-10 14:29:40 +08:00
|
|
|
3
andyhu 2014-05-10 14:52:48 +08:00
elasticsearch中文资料较少,我也是最近开始研究的,发现这东西太强悍了,功能非常多而且操作简便。但是官方文档渣得很,推荐搜下exploring elasticsearch,还算写的不错
|
|
|
4
javaluo 2014-05-11 11:29:24 +08:00
计算一下活跃度大概的分布,然后给一个最大值,,例如100.超过这个最大值,就封顶为100
|
|
|
5
hustlzp 2014-05-11 12:42:09 +08:00
|
|
|
6
hustlzp 2014-05-11 12:42:28 +08:00
|