天天看点

Elasticsearch实战(四)---中英文分词及拼音搜索

Elasticsearch实战-中英文分词及拼音搜素

文章目录

      • Elasticsearch实战-中英文分词及拼音搜素
        • 1.ElasticSearch 中英文分词插件
          • 1.1 分词插件
          • 1.2 默认分词
          • 1.3 IK分词-ik_smart
          • 1.4 IK分词-ik_max_word
          • 1.5 拼音分词
          • 1.6 拼音分词 查询

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":"湖北省武汉市光谷大道"
}
           

查看现在默认 插入数据 的分词设置 可以看到 现在是 一个字,一个字 拆开去分词的

Elasticsearch实战(四)---中英文分词及拼音搜索

这就是 为什么我们去查询 单个字也能够查询成功的原因

1.3 IK分词-ik_smart

IK分词器 有两种分词模式

  • ik_smart 粗粒度分词
  • ik_max_word 细粒度分词
#  指定 ik_smart 粗粒度分词
POST /jzjik/_analyze
{
  "text":"湖北省武汉市光谷大道",
  "tokenizer": "ik_smart"
}
           

看下分词结果, 分解成了 湖北省, 武汉市 , 光谷, 大道

Elasticsearch实战(四)---中英文分词及拼音搜索

可以按照常用习惯,进行粗粒度分词

1.4 IK分词-ik_max_word

IK分词器 有两种分词模式

  • ik_smart 粗粒度分词
  • ik_max_word 细粒度分词
# 细粒度分词 就是最大力度的分词,但是不是 单个字单个字的分词

POST /jzjik/_analyze
{
  "text":"湖北省武汉市光谷大道",
  "tokenizer": "ik_max_word"
}
           

可以看到分词结果 分别拆分成了 湖北省, 湖北, 省, 武汉市, 武汉, 市,光谷, 大道

Elasticsearch实战(四)---中英文分词及拼音搜索
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 等 拼音及缩写生成分词效果

Elasticsearch实战(四)---中英文分词及拼音搜索
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 查询 马云

Elasticsearch实战(四)---中英文分词及拼音搜索

ld 或者 ldh, 查询 刘德华

Elasticsearch实战(四)---中英文分词及拼音搜索

至此 我们分词,包括拼音分词 已经处理完毕, 下一篇 我们介绍 Springboot 结合 es 进行数据处理

继续阅读