1.业务场景
例如:我们实现一个公司的申请审批流程,整个业务流程涉及到两种角色,分别是商务角色与管理员角色,整个流程如下图所示:
核心流程总结为一句话:商务角色申请添加公司后由管理员进行审批。
商务在添加公司时,可能为了方便,直接填写公司的简称,而公司全称可能之前已经被添加过了,为了防止添加重复的公司,所以管理员在针对公司信息审批之前,需要查看以往添加的公司信息里有无同一个公司。
2.实现思路
从技术层面需要考虑实现的功能点:
1.分词
2.与库里已有的数据进行匹配
3.按照匹配度对结果进行排序
分词功能有现成的分词器,所以实现这样的业务场景核心重点就在如何与数据库中的数据匹配并按照匹配度排序。
3.技术选型
方案一:引入ES
方案二:利用MySQL实现
系统规模比较小的,不建议使用ES,单纯为了实现这个功能引入ES成本较大,还要涉及到数据同步等问题,系统复杂度会提高,所以尽量使用MySQL已有的功能进行实现。
MySQL提供了以下三种模糊搜索的方式:
- like匹配:要求模式串与整个目标字段完全匹配。
- RegExp正则匹配:要求目标字段包含模式串即可。
- Fulltext全文索引:在字段类型为CHAR,VARCHAR,TEXT的列上创建全文索引,执行SQL进行查询。
对相关技术进行优劣分析:
- like匹配:无法满足需求,所以pass;
- 全文索引:可定制性差,不支持任意匹配查询,pass;
- 正则匹配:可是先任意模式匹配,缺点在于执行效率不如全文索引。
针对于这个场景,记录数目相对来说没有那么多,所以对于效率稍低的结果可以接受,因此技术选型方面采用RegExp正则匹配
来实现模糊匹配的需求。