政策快报平台的全文检索:从ES到向量检索的演进

政策快报平台的全文检索:从ES到向量检索的演进
政策快报平台上线初期搜索功能很简单用户输入关键词系统在标题和正文里做关键词匹配。效果很差。搜“补贴”出不来“专项资金”搜“专精特新”出不来“小巨人”。用户的搜索词是口语化的政策文件是书面化的。两者之间有一道鸿沟。后来我们做了一系列改造从关键词检索到语义检索再到混合检索。今天复盘这个过程。3个阶段阶段一关键词检索Elasticsearch方案用Elasticsearch做全文检索对标题和正文建倒排索引。查询时按TF-IDF/BM25相关性排序。问题词不匹配就搜不到。用户搜“补贴”政策里写的是“专项资金”——匹配不上出不来结果。用户搜“小巨人”政策里写的是“专精特新”——同样匹配不上。这个阶段搜索点击率只有30%左右。用户经常搜不到想要的东西然后流失。优化尝试加同义词词典——“补贴”映射到“专项资金、补助、后补助、奖励”“专精特新”映射到“小巨人、隐形冠军、单项冠军”。效果有限同义词覆盖不全新词、生僻词无法及时补充。阶段二语义检索向量检索方案引入向量检索。用Sentence-BERT将用户查询和政策文本分别编码为向量计算余弦相似度按相似度排序。效果语义匹配。搜“补贴”能出“专项资金”搜“小巨人”能出“专精特新”。搜索点击率从30%涨到了50%左右。新问题向量检索吃资源。每次查询需要实时计算向量相似度CPU消耗高索引构建时间长新政策入库后无法立即被搜到语义检索有时过于“发散”搜“专精特新认定”会匹配到一些相关性不高的政策。阶段三混合检索ES 向量检索方案BM25 向量检索两种得分加权融合。精确匹配发文字号、政策名称走ES语义匹配走向量检索两者按权重合并排序。效果既保证了精确匹配搜“国发〔2026〕1号”能精确命中又保证了语义泛化搜“补贴”能出“专项资金”。搜索点击率从50%涨到了60%左右。几个关键的技术决策决策一为什么不用单一向量检索向量检索擅长语义泛化但不擅长精确匹配。用户搜“国发〔2026〕1号”这种精确的发文字号时向量检索的泛化能力反而成了干扰。混合检索取两者之长精确匹配走ES语义匹配走向量。决策二同义词词典还要不要要但角色变了。之前同义词词典是“主力”现在是“辅助”。向量检索能解决大部分语义泛化问题同义词词典只作为“兜底”覆盖向量模型训练数据中没有覆盖到的特殊词汇如最新政策术语。决策三向量模型的选择我们试用过OpenAI的embedding接口准确率高但延迟大每次查询都要调用外部API响应时间不稳定。最终选择了开源的Sentence-BERT多语言模型在政策领域数据上做了微调。结尾搜索的核心价值让用户“能找到自己想找的东西”。关键词→语义→混合每一次演进都在缩小用户表达和文件表达之间的差距。政策快报平台的搜索系统还在持续优化方向是让用户用最自然的方式表达需求系统能理解并返回最匹配的政策。技术选型有取舍平衡了准确性、召回率、响应时间和成本。目前ES做精确匹配兜底向量做语义泛化覆盖两者结合覆盖了绝大多数搜索场景。