• 微服务框架 SpringCloud微服务架构 17 初识ES 17.6 安装IK 分词器


    微服务框架

    【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

    SpringCloud微服务架构

    17 初识ES

    17.6 安装IK 分词器
    17.6.1 分词器

    es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。

    我们在kibana的DevTools中测试:

    # 测试分词器
    POST /_analyze
    {
      "analyzer": "standard",
      "text": "黑马程序员学习java太棒了!"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    语法说明:

    • POST:请求方式
    • /_analyze:请求路径,这里省略了http://192.168.150.101:9200,有kibana帮我们补充
    • 请求参数,json风格:
      • analyzer:分词器类型,这里是默认的standard分词器
      • text:要分词的内容

    在这里插入图片描述

    先用英文english 分词器试试

    # 测试分词器
    POST /_analyze
    {
      "analyzer": "english",
      "text": "黑马程序员学习java太棒了!"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果

    {
      "tokens" : [
        {
          "token" : "黑",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "",
          "position" : 0
        },
        {
          "token" : "马",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "",
          "position" : 1
        },
        {
          "token" : "程",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "",
          "position" : 2
        },
        {
          "token" : "序",
          "start_offset" : 3,
          "end_offset" : 4,
          "type" : "",
          "position" : 3
        },
        {
          "token" : "员",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "",
          "position" : 4
        },
        {
          "token" : "学",
          "start_offset" : 5,
          "end_offset" : 6,
          "type" : "",
          "position" : 5
        },
        {
          "token" : "习",
          "start_offset" : 6,
          "end_offset" : 7,
          "type" : "",
          "position" : 6
        },
        {
          "token" : "java",
          "start_offset" : 7,
          "end_offset" : 11,
          "type" : "",
          "position" : 7
        },
        {
          "token" : "太",
          "start_offset" : 11,
          "end_offset" : 12,
          "type" : "",
          "position" : 8
        },
        {
          "token" : "棒",
          "start_offset" : 12,
          "end_offset" : 13,
          "type" : "",
          "position" : 9
        },
        {
          "token" : "了",
          "start_offset" : 13,
          "end_offset" : 14,
          "type" : "",
          "position" : 10
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    从分词结果上看,英文 java 还是分出来了,但是中文…不尽如人意

    换成chinese 试试

    # 测试分词器
    POST /_analyze
    {
      "analyzer": "chinese",
      "text": "黑马程序员学习java太棒了!"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果:

    在这里插入图片描述

    可以看到结果和english 没区别【因为它没法儿 去理解中文含义,按意义进行分词】

    再看看标准分词器

    # 测试分词器
    POST /_analyze
    {
      "analyzer": "standard",
      "text": "黑马程序员学习java太棒了!"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果

    在这里插入图片描述

    还是这样【我们肯定不希望它是逐字分,而是按照词】

    处理中文分词,一般会使用IK分词器。https://github.com/medcl/elasticsearch-analysis-ik

    在这里插入图片描述

    今天是2022年10月31日,11天前,妙啊

    ik分词器包含两种模式:

    • ik_smart:最少切分,粗粒度
    • ik_max_word:最细切分,细粒度

    在线安装ik 插件【慢,刚刚笔者进GitHub都是那啥了的,才进去截了张图】

    # 进入容器内部
    docker exec -it elasticsearch /bin/bash
    
    # 在线下载并安装
    ./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
    
    #退出
    exit
    #重启容器
    docker restart elasticsearch
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【离线安装ik 插件】【推荐】

    安装插件需要知道elasticsearch的plugins目录位置,而我们用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过下面命令查看:

    docker volume inspect es-plugins

    在这里插入图片描述

    OK, 看到了

    之前我们把es 跑起来的时候,就已经做了数据卷关联

    【解压缩分词器安装包】

    先去到那个目录下

    在这里插入图片描述

    在这里插入图片描述

    【上传 到es 容器的插件数据卷中】

    直接拖进去

    在这里插入图片描述

    OK,不大,很快

    【重启容器】

    在这里插入图片描述

    OK了

    看下日志

    在这里插入图片描述

    OK, 可以看到,成功加载了IK 分词器

    直接在Dev Tools 测试

    IK分词器包含两种模式:

    • ik_smart:最少切分【粒度粗】【分出来的词少】

      # 测试分词器
      POST /_analyze
      {
        "analyzer": "ik_smart",
        "text": "黑马程序员学习java太棒了!"
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      运行结果:

      在这里插入图片描述

      OK,分词成功了

    • ik_max_word:最细切分

      # 测试分词器
      POST /_analyze
      {
        "analyzer": "ik_max_word",
        "text": "黑马程序员学习java太棒了!"
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      运行结果:

      在这里插入图片描述

      效果也很明显,这个模式下分出来的词更多【粒度细】【分出更多的词】

    【这两种模式用哪种,这就要看实际需要了,粒度越细,搜出来的概率肯定就越大,但是存储占用也会增大】

  • 相关阅读:
    我们来聊聊锁升级吧
    类与对象(初级)
    【附源码】Python计算机毕业设计企业人事系统
    Vue的数据来源详解
    卡尔曼滤波C++代码
    Chapter 12 End-User Task As Shell Scripts
    用XML的方式装配Bean
    springboot+jacob实现文字转语音
    服务名无效。 请键入 NET HELPMSG 2185以获得更多的帮助
    mmdet全教程
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128196465