上一篇聊了技术选型,这篇聊聊创作社区排序算法的设计。
排序算法是内容社区的核心,决定了什么内容被更多人看到,直接影响创作者的积极性和用户体验。
设计目标
1. 多维度综合评估:不能只看浏览量,要综合浏览、点赞、评论、打赏等多个指标
2. 鼓励优质内容:打赏和付费购买代表高价值认可,权重应该更高
3. 保持新鲜度:新内容要有机会曝光,不能让老帖子永远霸占排名
4. 可配置:管理员可以在后台调整权重,不需要改代码
核心算法:对数加权 + 时间衰减
评分公式:
score = w_views × ln(views + 1)
+ w_likes × ln(likes + 1)
+ w_replies × ln(replies + 1)
+ w_tips × ln(tips_count + 1)
+ w_tip_amt × ln(tips_amount + 1)
+ w_paid × ln(paid_count + 1)
final_score = score × (0.3 + 0.7 × 0.5^(days / half_life))
为什么用对数函数?
如果直接用原始数值,一篇浏览量10000的帖子会碾压所有浏览量1000以下的帖子,新人内容完全没有曝光机会。
用 ln(x+1) 对数函数后:
- 浏览量100 → ln(101) ≈ 4.6
- 浏览量1000 → ln(1001) ≈ 6.9
- 浏览量10000 → ln(10001) ≈ 9.2
差距被大幅压缩,但仍有区分度。这样优质新内容也有机会上浮。
为什么用半衰期衰减?
半衰期模型 0.5^(days/half_life) 的好处是衰减速度自然平滑:
- 半衰期7天的情况下,7天前的内容保留50%分数,14天前保留25%
- 最低保留30%分数,避免优质老帖被完全淹没
管理员可以配置半衰期天数,3天(新鲜度优先)到14天(质量优先)之间。
权重设计
默认权重设置:
- 浏览量 ×1.0:基础热度指标,但权重最低
- 点赞 ×3.0:主动认可,比浏览有分量
- 回复 ×2.0:互动深度,但灌水成本低
- 打赏次数 ×5.0:真金白银的认可,权重最高
- 付费购买 ×4.0:高价值转化行为
- 打赏金额 ×0.1/元:金额的边际递减
后台预设方案
管理员不需要手动调每个参数,我们内置了4种预设:
1. 均衡模式:各项指标权重适中,适合大多数场景
2. 质量优先:提高打赏/付费权重,降低浏览量权重,适合知识付费社区
3. 新鲜度优先:缩短半衰期,让新内容获得更多曝光,适合资讯类社区
4. 变现优先:大幅提高付费/打赏权重,适合以变现为核心的平台
技术实现
权重配置存储在SiteConfig表中,通过 get_ranking_config() 函数读取。管理员在后台修改后实时生效,不需要重启服务。
排序在Python层完成(目前数据量不大),后续如果数据量上来,可以考虑用Redis缓存计算结果。
这就是联创圈排序算法的全部设计思路。不是最复杂的算法,但够用、可调、好维护。
后续会继续分享联创圈的开发过程。有问题评论区交流。
登录后才能发表评论
立即登录