一、 背景
最近公司有一个需求,需要进行中文,中文的全拼音,中文的首字母进行模糊搜索,但是数据库全是中文,如果在在数据库添加拼音字段的话,工作量会特别大,所以我根据网上的大神给的方法,自己做了一个解决方案,给各位同行做个参考。
二、代码实现
1.首先判断用户输入的关键字keyword是中文还是英文
public static boolean isEnglish(String p) {
byte[] bytes = p.getBytes();
int i = bytes.length;//i为字节长度
int j = p.length();//j为字符长度
return i == j;
}
public static boolean isChinese(String str) throws UnsupportedEncodingException {
int len = str.length();
for(int i = 0; i < len; i ++) {
String temp = URLEncoder.encode(str.charAt(i) + "", "utf-8");
if(temp.equals(str.charAt(i) + ""))
continue;
String[] codes = temp.split("%");
//判断是中文还是字符(下面判断不精确,部分字符没有包括)
for(String code : codes) {
if(code.compareTo("40") > 0)
return true;
}
}
return false;
}
2.若输入的为中文,而数据库中也是存的中文,则直接根据like 关键字去模糊查询即可。
3.若输入的为英文,则可以将数据库中查得得中文转为拼音,再循环遍历该字段是否包含了用户输入得keyword的拼音,若包含则保留,否则过滤,下面说下如何将中文转为拼音;
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[0];
}
/**
* 对单个字进行转换
* @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();
}
}
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));
}
}
更多的中英文互相转化可以参考我另外一篇博客: 一文读懂PinYin4j —入门简介