Es提供了很多的分词方式,其中大家最常用的分词器应该是:
ik_max_word(精细分词)ik_smart(简易分词),我是es的初学者,工作中因为涉及到人名问题,领导提出想要把人名做同音词匹配处理(如:张三,张伞,张散),这三个人的名字的话都是zhangsan,这种情况,我们就需要用到拼音分词器。网上都有提供的,大家直接选择对应es版本的拼音分词器版本下载即可。直通车:拼音分词器链接。
1.下载成功之后呢,大家需要在Es的plugins文件夹下新建一个名字为pinyin的文件夹,然后把下载的拼音分词器的放入到pinyin文件夹下即可。放好之后重新启动es即可。
2.重启es后,大家可以先用kibana工具进行测试,如图:
大家可以看到,这是拼音分词器默认的分词方式。如果正常没有什么特殊需求的话其实这样的拼音分词器是可以直接这样使用的。但是因为我们工作需求,需要对人名进行全匹配,也就是说如说人名为张三的话,那么我的分词结果只有zhangsan。所以这个分词器无法满足工作需求,我也在网上查看了一些资料,找到一种办法,因为我的工作中,也用到了自定义的词库。如图:
这个词库的作用呢就是,如果某个词语在这个词库存在,我们就不进行拆分,进行全匹配,否则的话就显示暂无数据。当时也是在百度看到,可以先对你要搜索的词语进行汉字拆分,我用的是(ik_smart)再结合我们的词库使用,先用ik_smart分词之后如上图只有张三一个词语,随后我们再用拼音分词给他分词的话,同理只能得到zahngsan一个拼音了,上代码吧,大家一看代码就应该很清晰了。如下:
PUT my_index //创建索引
{
“index”: {
“number_of_replicas” : “0”, //设置索引分备份分片数量
“number_of_shards” : “5”, //设置索引的分片数量
“analysis”: {
“analyzer”: {
“ik_pinyin_analyzer”: { //自定义分词气的名称
“tokenizer”: “my_ik_pinyin”, //设置es的分词方式
“filter”: “pinyin_first_letter_and_full_pinyin_filter” //过滤器
},
“pinyin_analyzer”: { //设置拼音分词器的分词名称。
“tokenizer”: “my_pinyin” //设置他的分词方式
}
},
“tokenizer”: {
“my_ik_pinyin”: { //这就是ik_pinyin_analyzer(也就是首先要进行的分词方式)
“type”: “ik_smart”
},
“my_pinyin”: {
“type”: “pinyin”, //分词方式
“keep_first_letter”: false, //设置为true话如:张三 会分词为 zs
“keep_separate_first_letter”: false,//设置为true的话每个字的首字母都会进行分词
“keep_full_pinyin”: false,
“keep_joined_full_pinyin”: true,
“keep_none_chinese”: true,
“none_chinese_pinyin_tokenize”: false,
“keep_none_chinese_in_joined_full_pinyin”: true,
“keep_original”: false,
“limit_first_letter_length”: 16, //字符长度
“lowercase”: true,
“trim_whitespace”: true,
“remove_duplicated_term”: true
}
},
“filter”: {
“pinyin_first_letter_and_full_pinyin_filter”: {
“type”: “pinyin”,
“keep_first_letter”: false,
“keep_separate_first_letter”: false,
“keep_full_pinyin”: false,
“keep_joined_full_pinyin”: true,
“keep_none_chinese”: true,
“none_chinese_pinyin_tokenize”: false,
“keep_none_chinese_in_joined_full_pinyin”: true,
“keep_original”: false,
“limit_first_letter_length”: 16,
“lowercase”: true,
“trim_whitespace”: true,
“remove_duplicated_term”: true
}
}
}
}
}
基本就是上面这样,先ik分词,分词在之后再在ik分词器基础上使用拼音分词器进行分词。设置完之后呢如下图:
如果用java代码实现的话可以,使用
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();来实现,如下图所示:
设置完之后返回,通过createIndexRequest.settings(设置的xContentBuilder)即可。
还有一个问题就是es设置多个自定义的分词器,其实也挺简单的,例如同义词分词,只需要在"analyzer" 目录下添加自定义的分词方式即可如下图:
图中type:custom是指使用自定义的分词器。tokenizer:分词方式。filter:理解为过滤器。设置完之后在“filter”目录下设置即可,如下图:
在你的Es文件目录下,config文件夹下创建analysis,在analysis文件夹下穿件你自定义的同义词词典文件夹即可,注意,每个同意词一行,中间用逗号隔开否则不起作用,如下图:
初学者,大神勿喷。