万村乐站内全文检索:中文分词、索引与召回优化

📅 2026/8/24 2:16:03
万村乐站内全文检索:中文分词、索引与召回优化
万村乐数字乡村里的可检索内容不少村务论坛的帖子、通知公告、网格信息、政策文档。村民想找去年的防汛补贴怎么领如果只能按标题模糊匹配基本找不到。中文和英文不同词之间没有空格直接拿LIKE %防汛%扫全表数据量到几十万条时响应就到秒级了。我们给站内内容接了一套中文分词加倒排索引的检索方案查询耗时从改造前的平均1.4秒降到120毫秒以内召回相关帖子的准确率提升到89%。为什么要中文分词英文检索天然按空格切词digital village切出两个词。中文数字乡村防汛补贴是一串字必须靠分词器切成数字/乡村/防汛/补贴才有检索意义。万村乐的业务词很有地方特色网格员村两委土地流转这些在通用词典里不一定准所以我们在通用分词基础上挂了业务词库。实测挂词库后政策类查询的命中率从64%提升到88%。索引选型与存储我们没有自研索引而是用Elasticsearch承载站内检索论坛帖子、公告、网格文档分别建索引。增量同步靠监听MySQL 8.0.28的binlogCanal帖子一发布就进索引延迟控制在2秒内。对比早期用定时全量重建索引每次重建要18分钟期间检索不可用现在增量同步彻底解决了这个空窗。召回优化召回阶段容易两个问题一是分词太细导致召回太多噪声二是太粗漏掉相关结果。我们做了两件事。第一查询时用ik_smart做搜索分词比索引时的ik_max_word更粗减少碎词。第二对论坛帖子和通知公告按bizTag加权比如搜医保优先返回通知公告类因为村民大多想找政策而非闲聊。上线这套加权后搜索结果首条相关率从71%提到86%。某村做土地确权查询时村民输入宅基地前5条全部是政策解读帖体验明显改善。排序与相关性默认TF-IDF在村务场景不够用因为很多帖子词频差不多。我们引入时间衰减新公告权重更高再叠加标题命中加权。村民搜防汛时当年的预警公告排在最前三年前的旧帖沉下去。统计显示用户点首条结果的比例从39%升到58%。高亮与性能前端用Ant-Design-Vue 3.2.10渲染结果命中词高亮。检索接口加了一层Redis缓存热门词如医保补贴的结果缓存60秒命中率约34%高峰期帮ES扛掉三成流量。索引分片按县划分单县数据量控制在200万文档内查询稳定。方言与同义词村务检索的难点是村民用词不标准。有人搜医保有人搜合作医疗有人搜新农合指的都是一回事。我们在分词之外挂了同义词表查询时把同义词展开成布尔或。比如搜医保自动带上合作医疗新农合的召回。实测同义词展开后政策类查询的漏召回下降约18个百分点。检索监控检索质量要持续盯。我们记录每个查询的词、命中数、点击位置按周出热词榜和低效词榜。低效词搜了但前5条没点单独分析要么是分词不准要么是同义词缺失针对性补词库。2024年靠这个闭环站内检索的首条点击率从39%爬到61%。性能压测索引按县分片单县数据控制在200万文档。我们用20个热词做压测单分片QPS到800时P99延迟仍低于200毫秒。对比早期全表LIKE查询耗时从1.4秒降到120毫秒以内村民搜宅基地补贴基本秒出。移动端检索小程序和APP的检索入口共用同一套ES前端用Ant-Design-Vue渲染结果命中高亮。移动端额外做了拼音容错老人用拼音输入yanglao也能召回养老相关帖子。检索反哺运营2024年平台检索日均调用约3.2万次缓存命中率34%热门词如医保补贴防汛的缓存把ES压力降了三成。检索日志还反哺内容运营某季度土地流转搜索量环比涨了2.4倍我们随即组织专题阅读量比普通帖高约3倍。下一步计划接入语音检索覆盖不擅长打字的老年群体。检索的工程权衡检索不是越准越好要在准和快之间取舍。同义词展开能提召回但会引入噪声我们给同义词加权而非等权核心词权重高。索引刷新定2秒延迟村民基本无感P99稳定在200毫秒内首条相关率保持86%以上。工程上没有银弹只有适合村务场景的平衡点。我们还做了检索降级ES故障时切到MySQL的LIKE兜底虽然慢但能用。某次ES集群重启的8分钟里降级扛住了约4000次查询没让用户感知中断。可降级是检索服务必须有的底线。检索上线两年已成为村民找村务信息的第一入口日均调用稳定在3万次以上。检索体验的优化是个持续过程。我们每季度根据热词和低效词榜调一次词库和权重村民搜补贴医保宅基地的体感逐年变好。2024年底用户调研里找信息方便的好评分比年初高了21个百分点站内检索算真正立住了。检索系统的价值最终看村民能不能秒找到要的村务信息。2024年这项体感指标稳住了站内检索成了村民日常用得上的工具。小结万村乐数字乡村的站内检索技术上没有特别花哨的东西关键是把中文分词、倒排索引、增量同步和按业务加权重排这几步做扎实。村民能不能搜到想要的村务信息直接影响他们对平台的信任。下一步我们准备把语音搜索接进来覆盖不擅长打字的老年村民。