Elasticsearch实战-中英文分词及拼音搜素
1.ElasticSearch 中英文分词插件
基于文章 Elasticsearch实战(一)—安装及基本语法使用 前面的文章,我们已经基本使用了ES,而且也讲了 match 和 match_phrase的区别,今天讲一下如何分词
1.1 分词插件
# 我是用了 IK分词
IK分词器 :elasticsearch-analysis-ik-7.10.0
拼音分词: elasticsearch-analysis-pinyin-7.10.0
在官网上都可以下载 IK分词地址
如果GitHub下载太慢的,可以用这个链接下载
链接:https://pan.baidu.com/s/1spLBdCDCPtZ1sa_EXNkU5g?pwd=mhtn
提取码:mhtn
解压到 es/plugins 插件文件夹下,
重启ES
1.2 默认分词
# 执行
POST /jzjik/_analyze
{
"text":"湖北省武汉市光谷大道"
}
查看现在默认 插入数据 的分词设置 可以看到 现在是 一个字,一个字 拆开去分词的
这就是 为什么我们去查询 单个字也能够查询成功的原因
1.3 IK分词-ik_smart
IK分词器 有两种分词模式
- ik_smart 粗粒度分词
- ik_max_word 细粒度分词
# 指定 ik_smart 粗粒度分词
POST /jzjik/_analyze
{
"text":"湖北省武汉市光谷大道",
"tokenizer": "ik_smart"
}
看下分词结果, 分解成了 湖北省, 武汉市 , 光谷, 大道
可以按照常用习惯,进行粗粒度分词
1.4 IK分词-ik_max_word
IK分词器 有两种分词模式
- ik_smart 粗粒度分词
- ik_max_word 细粒度分词
# 细粒度分词 就是最大力度的分词,但是不是 单个字单个字的分词
POST /jzjik/_analyze
{
"text":"湖北省武汉市光谷大道",
"tokenizer": "ik_max_word"
}
可以看到分词结果 分别拆分成了 湖北省, 湖北, 省, 武汉市, 武汉, 市,光谷, 大道
1.5 拼音分词
我们经常见到 张三 名字输入 zhang 就可以出来 张三 这种情况,其实就是对姓名进行 拼音分词
先创建一个自定义的 拼音分词器
# 可以看到自定义了两个 拼音分词 ik_smart_pinyin 及 ik_max_word_pinyin
#底层用的 tokenizer 就是 粗粒度及细粒度分词
PUT /iktest/
{
"settings": {
"analysis": {
"analyzer": {
"ik_smart_pinyin": {
"type": "custom",
"tokenizer": "ik_smart",
"filter": ["my_pinyin", "word_delimiter"]
},
"ik_max_word_pinyin": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["my_pinyin", "word_delimiter"]
}
},
"filter": {
"my_pinyin": {
"type" : "pinyin",
"keep_separate_first_letter" : true,
"keep_full_pinyin" : true,
"keep_original" : true,
"limit_first_letter_length" : 16,
"lowercase" : true,
"remove_duplicated_term" : true
}
}
}
}
}
后面设置的 这些 到底有什么意思?
属性名字 | 说明 |
---|---|
keep_first_letter | true: 将所有汉字的拼音首字母拼接到一起:刘德华 -> ldh |
keep_full_pinyin | true:在最终的分词结果中,会出现每个汉字的全拼:刘德华 -> liu , de, hua |
keep_none_chinese | true: 是否保留非中文本,例如 java程序员, 在最终的分词结果单独出现 java |
keep_separate_first_lett | true: 在最终的分词结果单独将每个汉字的首字母作为一个结果:刘德华 -> l, d, h |
keep_joined_full_pinyin | true:在最终的分词结果中将所有汉字的拼音放到一起:刘德华 -> liudehua |
keep_none_chinese_in_joined_full_pinyin | true:将非中文内容文字和中文汉字拼音拼到一起 |
none_chinese_pinyin_tokenize | true: 会将非中文按照可能的拼音进行拆分 |
keep_original | true: 保留原始的输入 |
remove_duplicated_term | true: 移除重复 |
然后 插入文本 测试下 ,拼音分词是否生效
GET /iktest/_analyze
{
"text":"湖北省武汉市光谷大道",
//指定 字段使用 拼音分词
"analyzer": "ik_smart_pinyin"
}
查询结果,可以看到已经生效 ,拼音分别是 h,hu,b,bei,hbs 等 拼音及缩写生成分词效果
1.6 拼音分词 查询
设置 索引Mapping 把刚才定制的 拼音分词 用于数据字段上
# 给 iktest 索引 设置mapping, name 字段 设置 ik_smart_pinyin 拼音分词
PUT /iktest/_mapping
{
"properties": {
"name": {
"type": "keyword",
"fields": {
"pinyin": {
"type": "text",
"analyzer": "ik_smart_pinyin",
"boost": 10
}
}
}
}
}
# 插入一条数据 到iktest id=1
put /iktest/_doc/1
{
"name":"马云"
}
# 插入一条数据 到iktest id=2
put /iktest/_doc/2
{
"name":"刘德华"
}
然后用拼音 查询 试一试
m 查询 马云
ld 或者 ldh, 查询 刘德华
文章来源:https://www.toymoban.com/news/detail-627931.html
至此 我们分词,包括拼音分词 已经处理完毕, 下一篇 我们介绍 Springboot 结合 es 进行数据处理文章来源地址https://www.toymoban.com/news/detail-627931.html
到了这里,关于Elasticsearch实战(四)---中英文分词及拼音搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!