zhang1212 发表于 2019-10-23 13:48

java根据拼音搜索,但数据库为汉字的解决方案

本帖最后由 苏紫方璇 于 2019-10-23 20:17 编辑

最近公司有一个需求,需要进行拼音搜索,但是数据库全是中文,如果在在数据库添加拼音字段的话,工作量会特别大,所以我根据网上的大神给的方法,自己做了一个解决方案,给各位同行做个参考,本人菜鸟,欢迎多多指教{:1_893:}
以下为代码:

**1.以下代码是一个文字转拼音的工具类**


    import org.springframework.stereotype.Component;
   
    import net.sourceforge.pinyin4j.PinyinHelper;
    import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
    import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
    import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
   
    /**
   * pinyin4j汉字转拼音工具类
   * @AuThor zhiheng
   *
   */
    @Component
    public class ChangeToPinYin {
             //pinyin4j格式类
      private HanyuPinyinOutputFormat format = null;
      //拼音字符串数组
      private String[]pinyin;
   
      //通过构造方法进行初始化
      public ChangeToPinYin(){
   
            format = new HanyuPinyinOutputFormat();
            /*
             * 设置需要转换的拼音格式
             * 以天为例
             * HanyuPinyinToneType.WITHOUT_TONE 转换为tian
             * HanyuPinyinToneType.WITH_TONE_MARK 转换为tian1
             * HanyuPinyinVCharType.WITH_U_UNICODE 转换为tiān
             *
             */
            format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
            pinyin = null;
      }
   
      /**
         * 对单个字进行转换
         * @Param pinYinStr 需转换的汉字字符串
         * @Return 拼音字符串数组
         */
      public String getCharPinYin(char pinYinStr){
   
            try
            {
                //执行转换
                pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);
   
            } catch (BadHanyuPinyinOutputFormatCombination e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
   
            //pinyin4j规则,当转换的符串不是汉字,就返回null
            if(pinyin == null){
                return null;
            }
   
            //多音字会返回一个多音字拼音的数组,pinyiin4j并不能有效判断该字的读音
            return pinyin;
      }
   
      /**
         * 对单个字进行转换
         * @param pinYinStr
         * @return
         */
      public String getStringPinYin(String pinYinStr){
            StringBuffer sb = new StringBuffer();
            String tempStr = null;
            //循环字符串
            for(int i = 0; i<pinYinStr.length(); i++)
            {
   
                tempStr = this.getCharPinYin(pinYinStr.charAt(i));
                if(tempStr == null)
                {
                  //非汉字直接拼接
                  sb.append(pinYinStr.charAt(i));
                }
                else
                {
                  sb.append(tempStr);
                }
            }
   
            return sb.toString();
   
      }
   
    }
**2.以下为测试类,**
//查询数据库


      List<User> list=us.getAll(village);
      //new一个汉字转拼音的工具类
      ChangeToPinYin changeToPinYin = new ChangeToPinYin();
      //创建一个新的集合,来装符合查询的对象
      List<User> list1=new ArrayList<User>();
      //循环遍历
         for(int i=0;i<list.size();i++){
               System.out.println(list.get(i).getName());
               System.out.println(changeToPinYin.getStringPinYin(list.get(i).getName()));
               //把汉字转为拼音
               String p=changeToPinYin.getStringPinYin(list.get(i).getName());
                // boolean res=p.toLowerCase().contains(name.toLowerCase());
               //查看是否包含所查询的字符串
               boolean res=p.contains(name);
               System.out.println(res);
               //如果包含,
               if(res==true){
                         //装入新的lsit集合
                         list1.add(list.get(i));
               }
               
         }


}



代码结束;


希望帮助到大家

ywel叶子 发表于 2019-10-23 14:19

学到了,谢谢楼主

苏紫方璇 发表于 2019-10-23 20:18

帮你套了一个代码框

1.shui 发表于 2019-10-29 10:17

这方法好,我用的是添加拼音字段.

zhang1212 发表于 2019-10-29 16:03

1.shui 发表于 2019-10-29 10:17
这方法好,我用的是添加拼音字段.

主要是数据库已经好了突然来这个需求,在一个一个写就不现实了:lol

codetimer 发表于 2019-10-30 08:19

nice 啊,感谢分享

siweitang 发表于 2019-10-30 08:57

优秀如你!

共你山今 发表于 2019-11-1 22:26

可以可以,先收藏到时候需要可以用的上。
页: [1]
查看完整版本: java根据拼音搜索,但数据库为汉字的解决方案