最近接到需求,要求商城中进行半模糊搜索时,输入拼音字母同样要求进行自动匹配出相关品牌、类目、关键词等数据,从而进行筛选商品
汉字转换拼音部分在上篇文章已有较为详细的描述,本文中不在赘述!
根据拼音搜索汉字时存在以下几种情况
- 只有拼音 例如: k 、ko 、kou 、kouh 、kouhong
- 只有汉字 例如:口 、口红
- 前面汉字后面字母 例如:口h 、口hong、口红s
- 前面字母后面汉字 例如:kou红、k红
- 汉字与字母多次交叉 例如: kou红se、口hong红
需求中只需要前列精准匹配,后续模糊
/**
* 中文验证
* public static final String CHINESE_UNICODE_REGEX = "[\\u4E00-\\u9FA5]";
* @param str
* @return 验证通过返回true
*/
public static boolean isChinese(String str) {//验证是否为汉字
boolean b = false;
Pattern pattern = Pattern.compile(CommonConstant.CHINESE_UNICODE_REGEX);
Matcher m = pattern.matcher(str);
if (m.find()) {
return true;
}
return b;
}
public static String getChinese(String name){
StringBuilder chinese = new StringBuilder();//汉字字符串
StringBuilder noChinese = new StringBuilder();//非汉字字符串
int flog = 0;//标记,出现非汉字时标记1
for (int i = 0; i <= name.length()-1; i++){//遍历每个字符
String w = name.substring(i, i+1);
if (isChinese(w)){//验证是否是汉字
if (flog > 0){//已出现过非汉字后又重新出现汉字则将前面出现过的非汉字拼接到汉字后面
chinese.append(noChinese);
noChinese.delete(0,noChinese.length());
flog = 0;
}
chinese.append(w);
}else{
flog = 1;
noChinese.append(w);
}
}
return chinese.toString();
}
接口调用的方法中获取中文与拼音两个字符串数据
String chinese= CommonUtil.getChinese(name); //获取汉字
String pyName = PinyinUtils.getPinYin(name);//获取拼音
将汉字与拼音同时传入mybatis中拼接sql语句
select id, `name` from brand WHERE `name` like concat('口红','%') and name_py like concat('kouhong','%') group by id limit 10
此时关于拼音搜索匹配汉字部分已基本完成,若有更多更好的方法及本文的不足之处敬请指出,一切为了进步!