Django论坛搜索与推荐系统:OpenSearch + 质量信号的可解释排序
Django论坛搜索与推荐系统:OpenSearch + 质量信号的可解释排序
论坛的“检索即增长”。本文提供一套从零到一的可观测、可解释搜索与推荐方案:用 OpenSearch(或 Elasticsearch)承载全文检索,Django 侧管理索引、特征计算与 A/B 实验;最终以“质量信号 × 新鲜度 × 相关性”的融合排序上线。
索引与映射
- 文档类型:
thread(标题、正文、标签、作者、版块、创建/更新时间、质量特征)。 - 分词:中文用
ik_max_word+ 同义词/拼写纠错,英文用standard+edge_ngram做前缀匹配。 - 字段权重:
title^4、tags^2、body;author_reputation、reply_velocity作为数值特征。
{
"mappings": {
"properties": {
"title": {"type": "text", "analyzer": "ik_max_word"},
"tags": {"type": "keyword"},
"body": {"type": "text", "analyzer": "ik_max_word"},
"reply_velocity": {"type": "float"},
"age_days": {"type":"integer"},
"author_reputation": {"type":"float"}
}
}
}
写入与同步
- 采用 双写策略:帖子入库后同步写索引;编辑/删除采用
update_by_query或按doc_id覆盖。 - 批量回填质量特征:定时任务计算
点赞/收藏/回复速度/举报率等并回写索引。 - 失败重放:写索引失败的事件落 Redis Stream,专用 Worker 订阅重放。
排序模型(可解释)
- 基础 BM25 分数;
- 新鲜度衰减:
fresh = exp(-age_days / 14); - 质量项:
quality = log(1+like) + 0.7*log(1+bookmark) + 0.5*reply_velocity - 1.2*report_rate; - 综合:
score = bm25 * (0.6*fresh + 0.4) + 0.2*quality + 0.1*author_reputation。 - 特性开关:新手专区、招聘板块可单独上调新鲜度权重。
推荐与召回
- 多路召回:相似主题(词向量/SimHash)、同标签、关注作者、最近互动;
- 重排:去重、冷启动兜底(全站热+新)与多样性提升(Maximal Marginal Relevance)。
- 个人化:基于用户-标签矩阵的轻量协同过滤;隐私优先,匿名仅用上下文信号。
A/B 与可观测
- A/B 框架:
experiment_id注入请求头,后端记录曝光/点击/停留/转化; - 指标面板:查询延迟P95、零结果率、点击率、回搜率、满意度问卷采样;
- 日志:OpenSearch 慢查询、Django 维度埋点(关键词、命中数、版块)可回放复盘。
评论 0