• 【ES从入门到实战】二十一、全文检索-ElasticSearch-分词-分词&安装ik分词


    分词

    一个 tokenizer (分词器)接收一个字符流,将之分割为独立的 tokens (词元,通常是独立的单词),然后输出 tokens流。

    例如, whitespace tokenizer 遇到空白字符时分割文本。它会将文本"Quick brown fox!"分割为[Quick, brown, fox!l。

    该 tokenizer (分词器)还负责记录各个 term (词条)的顺序或 position位置(用于 phrase短语和 word proximity 词近邻查询) ,以及 term (词条)所代表的原始 word (单词)的 start(起始)和 end (结束)的 character offsets (字符偏移量) (用于高亮显示搜索的内容)。

    Elasticsearch 提供了很多内置的分词器,可以用来构建 custom analyzers (自定义分词器) 。

    测试 ES 默认的标准分词器:
    英文

    POST _analyze
    {
      "analyzer": "standard",
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }

    中文

    POST _analyze
    {
      "analyzer": "standard",
      "text": "pafcmall电商项目"
    }

    1)、安装 ik 分词器

    注意:不能用默认 elasticsearch-plugin install xxx.zip 进行自动安装

    进入 https://github.com/medcl/elasticsearch-analysis-ik/releases
    找到对应的 es 版本安装

    1、进入 es 容器内部 plugins 目录

    docker exec -it 容器id /bin/bash
    
    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

    2、安装 wget

    yum install wget

    3、下载和 ES 匹配版本的 ik 分词器:

    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

    4、unzip 下载文件并解压
    1)、使用 unzip 解压 elasticsearch-analysis-ik-7.4.2.zip 发现 unzip 命令还未安装,先安装 unzip

    2)、解压文件到 plugins 目录下的 ik 目录

    3)删除压缩包,并给 ik 目录及其文件授权

    rm -rf *.zip
    chmod -R 777 ik/

    5、可以确认是否安装好了分词器

    cd../bin
    elasticsearch plugin list:即可列出系统的分词器

    1)、进入docker中的es容器内

    2)、列出系统的分词器

    6、重启 ES 使 ik 分词器生效

    docker restart elasticsearch

    2)、测试分词器

    • 使用默认分词
      POST _analyze
      {
        "analyzer": "standard",
        "text": "pafcmall电商项目"
      }

      结果:

    • ik智能分词
    • POST _analyze
      {
        "analyzer": "ik_smart",
        "text": "pafcmall电商项目"
      }

      结果:

    POST _analyze
    {
      "analyzer": "ik_smart",
      "text": "我是中国人"
    }

    结果:

    • ik_max_word分词
    POST _analyze
    {
      "analyzer": "ik_max_word",
      "text": "我是中国人"
    }

    结果:

    够看出不同的分词器,分词有明显的区别,所以以后定义一个索引不能再使用默认的 mapping 了,要手工建立 mapping,因为要选择分词器。

    ik分词器出现的背景:
    分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,
    默认的中文分词是将每个字看成一个词,比如"中国的花"会被分为"中","国","的","花",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
     

    IK提供了两个分词算法
    ik_smart 和 ik_max_word
    其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

     
    我们分别来试一下 
    (1)最小切分:在浏览器地址栏输入地址 
    http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员 
    输出的结果为:
      "tokens" : [
        {
          "token" : "我",
          "start_offset" : 0,    
          "end_offset" : 1,
          "type" : "CN_CHAR",  
          "position" : 0 
        },
        {
          "token" : "是",
          "start_offset" : 1, 
          "end_offset" : 2,
          "type" : "CN_CHAR",  
          "position" : 1 
        },
        {
          "token" : "程序员",   
          "start_offset" : 2,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2 
        }
      ]
    }
    (2)最细切分:在浏览器地址栏输入地址
    http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
    输出的结果为:
    {  "tokens" : [
        {
          "token" : "我",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "CN_CHAR",
          "position" : 0 
        },
        {
          "token" : "是",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "CN_CHAR", 
          "position" : 1 
        },
        {
          "token" : "程序员", 
         "start_offset" : 2, 
         "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2 
        },
        {
          "token" : "程序",
          "start_offset" : 2, 
         "end_offset" : 4,
          "type" : "CN_WORD",
          "position" : 3 
        },
        {
          "token" : "员",
          "start_offset" : 4, 
         "end_offset" : 5,
          "type" : "CN_CHAR",
          "position" : 4 
        }
      ]
    }

    ik分词器支持自定义词库

    默认的分词并没有识别“小明”是一个词。如果我们想让系统识别“小明”是一个词,需要编辑自定义词库。
    步骤:
    (1)进入elasticsearch/plugins/ik/config目录
    (2)新建一个my.dic文件,编辑内容:
    小明
    修改IKAnalyzer.cfg.xml(在ik/config目录下)

     <properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!‐‐用户可以在这里配置自己的扩展字典 ‐‐>
        <entry key="ext_dict">my.dic</entry>
         <!‐‐用户可以在这里配置自己的扩展停止词字典‐‐>
        <entry key="ext_stopwords"></entry>
    </properties>

    重新启动elasticsearch即可



  • 相关阅读:
    C#输出JS代码封装类Alart
    我的汇编学习之路(2)win8(64位)下安装debug
    .NET使用一般处理程序生成验证码
    ?运算符(null合并运算符)和三木运算符
    讲解:小菜鸟自制的.NET实体类生成器
    我的汇编学习之路(1)进制转换
    未来
    callee,caller区别
    string::size_type
    ubuntu 12.04 LTS u盘安装
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/14697912.html
Copyright © 2020-2023  润新知