搜索联想算法后端接口服务(前缀版)
0x00 搜索联想
当我们使用搜素引擎时,键入少数关键字后搜索引擎就会给出多个基于你输入的词作为前缀的待选词列表,这就是搜索联想。如今,搜索联想功能几乎已成为各大内容平台(如电商、抖音等)的必备功能之一,实现良好的搜索联想功能能够大幅提高产品的用户体验。
搜索联想算法实现思路
- 最简单、经典的思路,是当用户输入关键词xx后,返回所有(或者按某种顺序返回topK)以xx为前缀的候选词。这种方法可以通过字典树/Trie树实现。目前绝大多数搜素引擎、电商平台的搜索栏目所提供的搜索词联想功能均基于字典树实现。当然,如果数据集合较小,基于SQL语句的like语法也可以实现相同的效果。
得到具有公共前缀的候选词基础上,可以参考一定的指标对候选词排序再返回,如参考搜索词搜索热度/频次等。
-
基于用户意图识别模型的搜索联想
-
……
基于字典树的搜索联想算法
0x01 基于Django的搜索联想接口服务示例:游戏名称联想
项目启动后即构建Trie树,当用户请求接口时,指定关键词参数,接口即返回以关键词为前缀的游戏名称列表。(数据来自本地的源于NGA游戏论坛的数据库)
接口请求示例:
关于该项目的容器化部署,可参考post
0x02 示例2: 基于Trie树的搜索联想 vs 基于SQL like查询的搜索联想
查询前缀 | Trie树耗时 | SQL like查询耗时 | 返回数据条数 |
---|---|---|---|
计算机 | 2ms | 46ms | 10 |
工业 | 5ms | 123ms | 6 |
社会 | 3ms | 32ms | 8 |
食品 | 3ms | 31ms | 6 |
教育 | 2ms | 14ms | 2 |
可见,同样为前缀查询,基于内存中的Trie树进行返回联想结果明显稳定比数据库即时like查询快。