拼音字母搜索匹配汉字

最近接到需求,要求商城中进行半模糊搜索时,输入拼音字母同样要求进行自动匹配出相关品牌、类目、关键词等数据,从而进行筛选商品
汉字转换拼音部分在上篇文章已有较为详细的描述,本文中不在赘述!
根据拼音搜索汉字时存在以下几种情况

  1. 只有拼音 例如: k 、ko 、kou 、kouh 、kouhong
  2. 只有汉字 例如:口 、口红
  3. 前面汉字后面字母 例如:口h 、口hong、口红s
  4. 前面字母后面汉字 例如:kou红、k红
  5. 汉字与字母多次交叉 例如: 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

此时关于拼音搜索匹配汉字部分已基本完成,若有更多更好的方法及本文的不足之处敬请指出,一切为了进步!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值