ElasticSearch pinyin分词支持多音字
背景
我们有一个搜索业务底层采用ElasticSearch作为搜索引擎,在索引的过程中,使用了ik中文分词、拼音分词、同义词等多种分词器。ES和各种插件的组合已经能满足我们线上90%的需求,但是仍有部分需求无法覆盖,我们在拼音分词的时候过程中就遇到了无法解决的问题。
比如在 三一重工
中,一重
这个词在拼音词库 polyphone.txt
中有对应的词汇,读作 yichong
,因此这整个词的读音为 sanyichonggong
, 但是其真实读音应该为 sanyizhonggong
。这是因为在拼音分词过程中会先去词库中检索是否有对应的词汇,没有的话再用单字拼音代替最后拼接在一起。
再比如在 蔚来汽车
中,蔚来
算是一个新词,在拼音词库 polyphone.txt
中没有对应的词汇,因此这个词对应的拼音是每个字的拼音拼接而成,结果为 yulai
。但是其真实读音应该为 weilai
, 那么我们的用户就无法通过拼音 weilai
搜索到相关的内容。
经过查看拼音分词源代码发现,拼音分词其实是调用nlp-lang这个项目里的方法实现的分词器。而这个nlp-lang项目中,拼音解析如果遇到多音字仅仅返回第一个拼音,这样很多读音都无法获取到。
if(temp.length()==1){
//单个字取第一个拼音
lists.add(PinyinFormatter.formatPinyin(word.getParam()[0], format));
} else {
for