前言
实际工作中,与C端交互的需求常会涉及到模糊查询,解决思路一般有如下几种:
- 数据库实现:like语句,全文索引;
- ES实现;
- 代码逻辑实现;
三种解决方案在针对不同场景往往能得到很好的运行效果,本文主要介绍第三种。
一、适用场景
已有的功能上忽然要加一些筛选条件,并且还要求支持模糊查询,此时如果使用数据库必然要考虑在原有表设计上加一些索引,但如果使用like语法还不能有效利用到索引,这时就可以考虑在已查出的大范围数据下使用业务逻辑来进行筛选,可以想到的筛选方法有如下几种:
- 条件字段拼接后使用indexOf()方法;
- 条件字段拼接后使用contains()方法;
- 使用List的contains()方法;
- 使用Map的containsKey()方法;
下面对四种方法一一就行实现和比较。
二、数据筛选
1.分析
四种实现方式,实现1与2可以进行模糊查询,其余两种只能进行精确匹配,用字符串实现最好使用一个分隔符进行隔开(当然最好使用一个特别的,保证不会与实际内容冲突的标识),隔开的目的是防止多个字符串拼接后得到本不应该存在的内容,如:用户查手机号为18899776600的内容,而作为筛选的字段分别有账号:2021070018899,昵称:776600CSDN,若不用分割,拼接后的内容为“2021070018899776600CSDN”,此时我们发现用户想要查找的内容出现在了拼接字符串中,所以字段分割是一定要做的。
2.实现
条件字段拼接后使用indexOf()方法:
long begin = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuilder queryStr = new StringBuilder();
queryStr.append("测试人员");
queryStr.append("-");
queryStr.append("13680001111");
queryStr.append("-");
queryStr.append("1610413816458");
queryStr.append("-");
queryStr.append("1098713809878")