网站本科报考官网,安徽工程建设发展有限公司,wordpress 手机不显示内容,购物网站功能Elasticsearch Pinyin拼音分词器 1. 前言2. pinyin分词器的多音字的错误修改3. 案例3.1 创建Mapping3.2 插入测试文档3.3 测试拼音搜索3.4 查看拼音分词后结果 4. 结语 1. 前言
在开发企业项目时#xff0c;根据拼音搜索是很常见的场景#xff0c;比如#xff1a;
人员通讯… Elasticsearch Pinyin拼音分词器 1. 前言2. pinyin分词器的多音字的错误修改3. 案例3.1 创建Mapping3.2 插入测试文档3.3 测试拼音搜索3.4 查看拼音分词后结果 4. 结语 1. 前言
在开发企业项目时根据拼音搜索是很常见的场景比如
人员通讯录不确定人名具体是哪个汉字只知道读音可以输入汉字全拼音、汉字拼音首字母、拼音首字母等股票名称炒股的人都知道股票太多记住所有股票code是不可能的所以常用拼音首字母查股票。 Medcl大佬为我们提供了Pinyin分词器可以让我们非常方便的使用拼音搜索文档。
2. pinyin分词器的多音字的错误修改
网上关于pinyin分词器的安装和使用的博客特别多这里我就不赘述了。但是我得说一个非常重要的问题目前我写博客时最新的版本8.x还是有这样的问题。虽然GitHub上已经有人提出了这个Issue但是目前还没有修复所以我们就自己动手手动改改吧。
问题就是多音字“银行”的“行”pinyin分词器会把“yin hang”错误的转成“yin xing”当你测试“中国银行”时它是对的但是“建设银行”时就又错了。不信的话你自己试试看。
这个时候需要修改下图中的jar包解压出来 然后修改如下图中文件polyphone.txt注意千万不要一下子把yin xing替换成yin hang。
因为“隐形”、“银杏”这些词的拼音就是yin xing。这个你需要手动一个一个看好了改我不确定这个问题是nlp-lang的问题还是pinyin分词器作者改的问题我看nlp-lang1.7的源代码这个文件里“银行”确实是对的yin hang。
改好后再重新打成nlp-lang-1.7.jar包替换上图的那个nlp-lang-1.7.jar文件然后重启ES就行啦。
3. 案例
Pinyin分词器的配置参数还是比较多的可以参考它GitHub的说明 这些配置一定要认真配不同的配置出来的搜索效果是不同的。
3.1 创建Mapping
我把拼音分词器作用在name.pinyin这个子字段上因为name这个主字段按照standard分词有用我这么设计适合人名搜索、股票名称搜索这些值比较短的场景如果是文章内容留言评论这些内容长的一般按照IK分词就行如果非要支持拼音搜索可以把IKPinyin组合起来设置tokenizer为ik_smartfilter为pinyin
PUT pigg_test_pinyin
{settings:{analysis:{analyzer:{pinyin_analyzer:{tokenizer:my_pinyin}},tokenizer:{my_pinyin:{type:pinyin,keep_first_letter:true,keep_separate_first_letter:true,keep_full_pinyin:true,remove_duplicated_term:true}}}},mappings:{properties:{name:{type:text,analyzer:standard,fields:{pinyin:{type:text,analyzer:pinyin_analyzer}}}}}
}3.2 插入测试文档
PUT pigg_test_pinyin/_doc/1
{name: 亚瑟王
}PUT pigg_test_pinyin/_doc/2
{name: 鼓励王
}3.3 测试拼音搜索
按照中文
GET pigg_test_pinyin/_search
{query: {match: {name.pinyin: {query: 瑟王,operator: and}}}
}按照中文拼音全拼
GET pigg_test_pinyin/_search
{query: {match: {name.pinyin: {query: 亚sewang,operator: and}}}
}按照中文拼音首字母
GET pigg_test_pinyin/_search
{query: {match: {name.pinyin: {query: 亚sw,operator: and}}}
}按照拼音首字母
GET pigg_test_pinyin/_search
{query: {match: {name.pinyin: {query: ysw,operator: and}}}
}3.4 查看拼音分词后结果
第1种方法
GET pigg_test_pinyin/_doc/1/_termvectors?fieldsname.pinyin第2种方法
GET pigg_test_pinyin/_analyze
{analyzer : pinyin_analyzer,text : 亚瑟王
}通过上面2种方法都可以发现分词结果如下
y, s, w, ysw, ya, se, wang这是因为我设置了keep_separate_first_letter:true这样拼音的首字母ysw会再次拆分成y, s, w。 这样我们搜索亚sw时就能匹配到文档了。
4. 结语
作为大龄程序员30多岁了不需要涉及太多技术得潜心专研一两个技术并戒掉浮躁在项目实践中打磨自己。 所以光看文档、博客是没有用的只有动手实践去解决业务问题才会有更好的成长。