Django论坛搜索与推荐系统:OpenSearch + 质量信号的可解释排序

Django论坛搜索与推荐系统:OpenSearch + 质量信号的可解释排序

论坛的“检索即增长”。本文提供一套从零到一的可观测、可解释搜索与推荐方案:用 OpenSearch(或 Elasticsearch)承载全文检索,Django 侧管理索引、特征计算与 A/B 实验;最终以“质量信号 × 新鲜度 × 相关性”的融合排序上线。

索引与映射

  • 文档类型:thread(标题、正文、标签、作者、版块、创建/更新时间、质量特征)。
  • 分词:中文用 ik_max_word + 同义词/拼写纠错,英文用 standard + edge_ngram 做前缀匹配。
  • 字段权重:title^4tags^2bodyauthor_reputationreply_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