多实体搜索
P0统一搜索框可搜索帖子、评论、社区、用户,结果分组展示,Tab 切换查看各类型。
实现要点:使用 Meilisearch 多索引(posts / comments / users / pages),查询时并行检索并合并,每组返回前 N 条,点击「查看更多」进入该类型完整结果页。
Module 09 · V1.0 · Search & Discovery
让沉淀的好内容被重新使用
构建覆盖帖子、评论、社区、用户的多实体搜索,配合筛选、排序、高亮与联想,让历史内容重新产生价值。
社区最大的浪费是「优质内容被埋没」。搜索是内容复用率的直接决定因素,也是用户留存与口碑的关键。
共 8 个功能点,每个功能点给出实现要点,可直接作为开发任务的描述。
统一搜索框可搜索帖子、评论、社区、用户,结果分组展示,Tab 切换查看各类型。
实现要点:使用 Meilisearch 多索引(posts / comments / users / pages),查询时并行检索并合并,每组返回前 N 条,点击「查看更多」进入该类型完整结果页。
按社区、作者、时间范围、帖子类型、Flair、标签、分数区间、是否有媒体等条件过滤。
实现要点:筛选条件序列化到 URL query,便于分享与回退。支持保存筛选为「自定义视图」。
相关度(Relevance)、最新、最高分、最多评论四种排序。
实现要点:相关度使用 BM25 + 字段加权(标题权重高于正文)+ 时间衰减与内容质量(分数)作为软加权因子。
中文分词(IK 分词器)、同义词扩展、拼音搜索、拼写纠错、繁简兼容。
实现要点:建立同义词词典与拼音字段;拼写纠错基于 ES 的 term suggester + 自定义词典。
输入时实时联想(内容标题、社区名、用户名、热门搜索词),并保留个人搜索历史与热搜榜。
实现要点:联想接口单独走极轻量的前缀查询(Redis 前缀树或 ES completion suggester),响应需 ≤ 100ms。
关键词在标题与摘要中高亮;悬停显示内容预览卡片。
实现要点:使用 ES highlight 能力生成高亮片段,前端渲染时对 HTML 做白名单过滤,只允许 <em> 标签。
内容变更(创建/编辑/删除)通过消息队列异步同步到 ES,保证最终一致。
实现要点:对失败同步做重试与死信队列;提供全量重建索引的管理员工具。删除使用软删除标记并定期物理清理。
搜索需尊重用户的屏蔽设置;被删除内容不进索引;私密社区内容对非成员不可见。
实现要点:索引阶段直接排除私密内容;查询阶段对结果做一次 ACL 过滤(filter by visibility)。
2 条关键交互的分步流程,按用户体验顺序描述,可直接作为前端开发与可用性测试脚本。
点击搜索框或按 / 快捷键聚焦;输入 2 个字符后开始联想。
按回车进入结果页,默认展示「相关度」排序,结果按类型分组 Tab。
右侧筛选面板可叠加条件,筛选后 URL 同步更新可分享。
无结果时给出「放宽条件」建议与相似内容推荐。
社区页提供「仅在本社区搜索」开关,默认勾选。
搜索结果顶部明确标注「在 c/xxx 中搜索」,可一键切换为全站搜索。
6 条硬性约束。这些规则应当在服务层强校验,而非仅在前端提示。
搜索需登录(防止被爬虫批量抓取),未登录仅可搜索社区与用户。
单用户搜索 QPS 限 5,超出返回 429。
被屏蔽用户的内容不出现在搜索结果中。
已被删除/隐藏状态的内容不进入索引;恢复后重新入索引。
搜索历史保留最近 20 条,可一键清空。
私密社区内容对非成员完全不可检索。
本模块涉及的 6 张表。完整字段、索引与说明见「数据表设计」页。
本模块的设计参照了哪些产品,具体参照了什么。
V2EX
搜索能力弱是其明显短板,反向说明搜索的重要性。
掘金
中文分词与联想体验好,适合中文社区参考。
支持语法式搜索(subreddit:、author:、flair:),高级用户效率极高。
Discourse
支持高级搜索语法的同时提供可视化筛选面板。
本模块交付时应当达到的量化目标。未达标即视为该模块未完成。
竞品踩过的坑,以及本模块在实现时最容易犯的错误。
索引同步若走同步双写,一次 ES 抖动就会拖垮发帖接口,必须异步。
中文不配分词器会退化为按字匹配,结果质量极差。
搜索必须做 ACL 过滤,否则私密社区内容会从搜索侧泄露。
被删除内容若不从索引移除,会出现「点进去 404」的糟糕体验。