1.什么是分词

对于非结构语言的查询,如果采用全文检索的方式进行查询,需要进行对其进行分词处理
分词,顾名思义,将一句话或一大段话,通过一定的规则,分割成多个词条的过程称为分词

2.ES中分词器的构成

ES中的分词器由以下三部分组成:

  1. Character Filters:针对原始文本处理,比如去除 html 标签,标点符号,语气词等。一个分词器中可以包含0至多个Character Filters
  2. Tokenizer:按照规则将原始文本切分为词条,比如按照空格切分。一个分词器中有且只有一个Tokenizer
  3. Token Filters:将切分的单词进行加工,比如大写转小写,删除结语词,增加同义语。一个分词器中可以包含0至多个Token Filters

大致分词器内部流程可参考下图:
image.png

3.ES内置分词器

  1. Standard Analyzer :默认分词器,按词切分,小写处理
  2. Simple Analyzer:按照非字母切分(符号被过滤),小写处理
  3. Stop Analyzer:小写处理,停用词过滤(the ,a,is)
  4. Whitespace Analyzer:按照空格切分,不转小写
  5. Keyword Analyzer:不分词,直接将输入当做输出
  6. Pattern Analyzer:正则表达式,默认 \W+
  7. Language:提供了 30 多种常见语言的分词器
  8. Customer Analyzer:自定义分词器

    4.常用的中文分词器

    IK

    优势:支持自定义词库,支持热更新分词字典
    github地址:https://github.com/medcl/elasti
    分类:
  • ik_max_word:分词颗粒度小,满足业务场景更丰富
  • ik_smart:分词器颗粒度较粗,满足分词场景要求不高的业务

    5.如何测试分词器

    在es中,可以通过_analyze路由指定分词器以及要被分词的短语,来获取到这个短语使用指定分词器后的分词结果。通常来说,我们可以利用这个功能来实现分词器的测试
    如下示例,analyzer为指定的分词器,text为要被分词的短语
    1. GET /_analyze
    2. {
    3. "analyzer": "standard",
    4. "text": "she has an sex feet too!!ob my god!!!"
    5. }
    image.png

    6.中文分词器部署

    准备

    前置条件,已配置好es集群,请参考:ElasticSearch部署
    以ik分词器为例

    进入目录

    cd /usr/local

    查看当前es版本

    浏览器输入:http://120.48.107.224:9201/ 查看。如图,版本8.0
    image.png

    下载

    下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
    下载对应版本的zip压缩包即可
    image.png
    如图,下载完毕
    image.png

    创建ik插件文件夹

  1. mkdir /usr/local/elasticsearch-set/elasticsearch-1/plugins/ik
  2. mkdir /usr/local/elasticsearch-set/elasticsearch-2/plugins/ik
  3. mkdir /usr/local/elasticsearch-set/elasticsearch-3/plugins/ik

    解压

  4. unzip elasticsearch-analysis-ik-8.0.0.zip -d elasticsearch-set/elasticsearch-1/plugins/ik/

  5. unzip elasticsearch-analysis-ik-8.0.0.zip -d elasticsearch-set/elasticsearch-2/plugins/ik/
  6. unzip elasticsearch-analysis-ik-8.0.0.zip -d elasticsearch-set/elasticsearch-3/plugins/ik/
  7. cd elasticsearch-set/elasticsearch-3/plugins/ik/
  8. ll

image.png

授权

  1. chgrp -R esuser /usr/local/elasticsearch-set/elasticsearch-1/plugins/ik
  2. chown -R esuser /usr/local/elasticsearch-set/elasticsearch-1/plugins/ik
  3. chmod 777 /usr/local/elasticsearch-set/elasticsearch-1/plugins/ik
  4. chgrp -R esuser /usr/local/elasticsearch-set/elasticsearch-2/plugins/ik
  5. chown -R esuser /usr/local/elasticsearch-set/elasticsearch-2/plugins/ik
  6. chmod 777 /usr/local/elasticsearch-set/elasticsearch-2/plugins/ik
  7. chgrp -R esuser /usr/local/elasticsearch-set/elasticsearch-3/plugins/ik
  8. chown -R esuser /usr/local/elasticsearch-set/elasticsearch-3/plugins/ik
  9. chmod 777 /usr/local/elasticsearch-set/elasticsearch-3/plugins/ik

    重启es服务器

  10. supervisorctl status

image.png

  1. supervisorctl restart elastic-1
  2. supervisorctl restart elastic-2
  3. supervisorctl restart elastic-3

    测试

    kibana分词输入如下测试

    1. GET _analyze
    2. {
    3. "text": ["金州勇士总冠军"],
    4. "analyzer": "ik_max_word"
    5. }

    如图,ik分词器已成功安装
    image.png

    7.中文分词测试

    创建索引并指定ik分词器

    1. PUT student
    2. {
    3. "mappings": {
    4. "properties": {
    5. "name":{
    6. "type": "text",
    7. "analyzer": "ik_max_word"
    8. },
    9. "des":{
    10. "type": "text",
    11. "analyzer": "ik_max_word"
    12. }
    13. }
    14. }
    15. }

    准备数据

    1. PUT student/_bulk
    2. { "create":{} }
    3. {"name":"冯铁城","des":"一个帅小伙"}
    4. { "create":{} }
    5. {"name":"张钰玲","des":"一个小姑娘"}
    6. { "create":{} }
    7. {"name":"马冬梅","des":"你要干什么"}
    8. { "create":{} }
    9. {"name":"夏洛","des":"全班排名第二的大傻子,也是个帅小伙"}

    测试

  4. 查询描述中带有”一个”的学生

    1. GET student/_search
    2. {
    3. "query": {
    4. "match": {
    5. "des": "一个"
    6. }
    7. }
    8. }

    image.png

  5. 查询描述中带有”小伙”的学生

    1. GET student/_search
    2. {
    3. "query": {
    4. "match": {
    5. "des": "小伙"
    6. }
    7. }
    8. }

    image.png