政策快报平台上线时,搜索功能是基于Elasticsearch的关键词匹配。
用户搜"专精特新",只能搜到标题或正文里包含"专精特新"这四个字的政策。但很多相关的政策叫"小巨人企业培育""隐形冠军认定",跟"专精特新"说的是同一件事,但搜不出来。
用户搜"补贴",只能搜到标题里带"补贴"二字的政策,但很多政策叫"专项资金""后补助""奖励资金",用户搜不到。
关键词匹配只能解决"字面相同"的问题,解决不了"意思相同"的问题。
后来我们做了3次升级,把搜索从"关键词匹配"升级到了"语义理解"。搜索准确率从65%提升到了89%。今天复盘这3次升级的思考。
3次升级
第一次升级:同义词词典(从"字面匹配"到"词义扩展")
在ES之上加了一层同义词扩展。用户搜索时,系统自动把搜索词扩展成一组同义词,再交给ES查询。
示例:
-
搜"专精特新" → 自动扩展为"专精特新 OR 小巨人 OR 隐形冠军 OR 单项冠军"
-
搜"补贴" → 自动扩展为"补贴 OR 补助 OR 专项资金 OR 后补助 OR 奖励"
效果:搜索命中率提升了约20%,用户搜到相关政策的概率明显提高。
局限:同义词覆盖不全。新词、生僻词、组合词无法及时补充。比如"新质生产力"这个词出来之后,同义词词典还没来得及更新,用户搜"新质生产力"还是搜不到相关文件。
第二次升级:向量检索(从"词义扩展"到"语义理解")
引入向量检索。将用户查询和政策文本分别通过Sentence-BERT模型编码为向量,计算余弦相似度,按相似度排序返回结果。
优势:
-
不依赖同义词词典,模型自动学习语义关系
-
搜"专精特新"能匹配"小巨人""隐形冠军"
-
搜"中小企业支持政策"能匹配"小微企业扶持措施"
-
搜"研发费用优惠"能匹配"研发费用加计扣除"
效果:搜索准确率从65%提升到了82%。用户搜不到的情况大幅减少。
新问题:向量检索擅长语义泛化,但有时过于"发散"。用户搜一个精确的政策名称时(如"国发〔2026〕1号"),向量检索反而会匹配到一堆语义相似但不相关的文件,精确匹配能力不如ES。
第三次升级:混合检索(ES + 向量检索)
ES擅长精确匹配,向量检索擅长语义理解。两者结合,取长补短。
混合策略:
-
用户搜索时,系统同时执行ES查询和向量检索
-
ES负责精确匹配(政策名称、发文字号、特定关键词)
-
向量检索负责语义泛化(同义词、近义词、相关概念)
-
两种得分按权重融合,得出最终排序
权重分配依据:
-
精确查询(含发文字号、完整政策名称) → ES权重提高,向量权重降低
-
模糊查询(行业词、概念词) → ES权重降低,向量权重提高
效果:搜索准确率从82%提升到了89%,精确匹配和语义泛化得到了平衡。
技术架构
text
复制
下载
用户查询
↓
查询意图判断(精确or模糊)
↓
├─ 精确查询 → ES全文检索(BM25)
└─ 模糊查询 → 向量检索(Sentence-BERT)
↓
结果融合与重排序
↓
返回最终结果
几点经验总结
第一,同义词词典虽然不如向量检索"智能",但实现简单、成本低、可控性强,在初期阶段依然有价值。同义词词典+ES也可以解决大部分问题,不必一开始就追求向量检索。
第二,向量检索解决的是"语义泛化"问题,但它引入了一个新的问题:精确匹配能力下降。混合架构是更务实的方案,而不是单一技术路线。
第三,搜索系统的准确率提升,往往是多个优化叠加的结果,而不是某一个"神器"的功劳。同义词扩展提升了10%,向量检索又提升了10%,混合检索再提升了5%------叠加在一起,才从65%到了89%。
结尾
从ES到同义词、从同义词到向量、从向量到混合检索------每一步都解决了当时的主要问题,也为下一步的优化留出了空间。