使用IK分词插件(analysis-ik)

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

IK分词插件(analysis-ik)是阿里云Elasticsearch(简称ES)的扩展插件,提供了基于词典的分词能力,默认不能卸载。所有类型的词典均默认使用IK分词插件的原生配置文件,通过更新词典,您可以修改IK分词插件的默认词库或添加新的词库,改善分词效果,让分词结果更加符合业务场景需求。在开源插件的基础上,IK分词插件扩展支持了通过对象存储OSS动态加载词典文件的功能。

前提条件

集群状态为正常,可在实例的基本信息页面查看。具体操作请参见查看实例的基本信息

说明

部分低版本实例的界面和支持的功能可能与本文有区别,请以控制台为准。

IK分词插件介绍

IK分词器的分词规则

IK分词插件的分词器的分词规则包括ik_smart和ik_max_word两种:

  • ik_max_word:将文本按照最细粒度进行拆分,适合术语查询。例如会将计算机汉字输入方法拆分为计算机,计算,算机,汉字输入,汉字,输入,方法

  • ik_smart:将文本按照粗粒度进行拆分,适合短语查询。例如会将计算机汉字输入方法拆分为计算机,汉字输入,方法

支持的词典类型

IK分词插件支持以下几种词典类型:

词典类型

词典说明

词典文件要求

更新方式

主词典(main.dic)

IK分词插件原生内置的主词典包含27万多条中文词语。

如果在创建ES索引时指定了主分词词典,向集群中写入数据时,数据中包含主分词词典中的词,集群就会建立索引,并且该索引能通过关键词被查询到。

每行一个词,保存为UTF-8编码的DIC文件。

停用词词典(stopword.dic)

IK分词插件原生内置的停用词词典中包含英文的停用词,例如a、the、and、at、but等。

如果在创建ES索引时指定了停用词词典,向索引中写入数据时,数据中包含的停用词词典中的词会被过滤掉,不会出现在倒排索引中。

说明

如果您需要使用中文停用词,可参考官方ES默认的IK分词配置文件中config目录下的extra_stopword.dic文件。该文件中包含的停用词包括:也、了、仍、从、以、使、则、却、又、及、对、就、并、很、或、把、是、的、着、给、而、被、让、在、还、比、等、当、与、于、但。

介词词典(preposition.dic)

存放介词

-

IK词典冷更新

量词词典(quantifier.dic)

存放单位相关的词和量词。

suffix.dic

存放后缀

-

不支持更新

surname.dic

存放中国的姓氏。

支持的词典更新方式

阿里云ES的IK分词插件支持IK词典冷更新IK词典热更新

更新方式

生效方式

加载方式

推荐应用场景

冷更新

对整个集群的词典进行更新,词典生效会触发集群重启。

系统将上传的词典文件传送到ES节点上,然后重启ES节点加载词典文件。

  • 如果您需要替换默认词典文件或删除默认词典文件中的内容,使用IK词典冷更新。

  • 如果您需要更新介词词典或量词词典文件,使用IK词典冷更新。

热更新

  • 上传同名词典文件时,不会触发集群重启,集群会在运行过程中直接加载词库。

  • 第一次上传词典文件、新增或删除词典文件、词典文件名称发生变化时,会触发集群重启,集群需要重新加载词典的配置。

  • 仅词典文件内容发生变化时,ES节点会自动加载上传的词典文件,实现词典的更新操作。

  • 如果词典文件列表或词典名称发生变化,集群需要重启重新加载词典的配置。

如果您需要扩充主词典或停用词词典文件,或变更扩充词典文件,建议使用IK词典热更新。

更新词典

对于已经配置了IK分词的索引,IK词典冷更新或热更新完成后,将只对新数据(包含新增数据和更新后的数据)生效。如果您希望对全部数据生效,需要重建索引。

IK词典冷更新

您可以通过冷更新方式替换词典文件,替换过程需要重启ES集群。

警告

冷更新操作会触发集群重启,为保证您的业务不受影响,请在业务低峰期进行操作。

  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Elasticsearch实例
  3. 进入目标实例。
    1. 在顶部菜单栏处,选择资源组和地域。
    2. Elasticsearch实例中单击目标实例ID。
  4. 在左侧导航栏,选择配置与管理 > 插件配置

  5. 系统默认插件列表页签,找到analysis-ik插件,在其右侧操作列中单击冷更新

  6. IK词库配置-冷更新控制面板,单击目标词典右侧的编辑,添加或替换对应的词典文件后单击保存

    词典文件更新方式包括:

    • 上传本地文件:单击文件上传区域上传词典文件,或拖拽词典文件到上传区域。

    • 上传OSS文件:输入Bucket名称和词典文件名称,单击添加

      • Bucket与阿里云ES实例需要在同一地域。

      • 不支持自动同步更新词典文件。源端OSS中的词典文件内容发生变化后,需要通过冷更新使之生效。

    说明
  7. 单击确定

    ES实例重启成功后,即词典文件更新成功。

  8. (可选)登录ES实例的Kibana控制台,测试词典是否生效。

    说明

    登录Kibana控制台,请参见登录Kibana控制台

    在Kibana控制台的开发工具(Dev Tools)上执行以下代码:

    GET _analyze
    {
      "analyzer": "ik_smart",
      "text": ["您词典中包含的词"]
    }

    text的值为["计算机汉字输入方法"],则返回结果如下:

    {
      "tokens" : [
        {
          "token" : "计算机",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "汉字输入",
          "start_offset" : 3,
          "end_offset" : 7,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "方法",
          "start_offset" : 7,
          "end_offset" : 9,
          "type" : "CN_WORD",
          "position" : 2
        }
      ]
    }

IK词典热更新

您可以通过扩展词典更新的方式扩充主词典和停用词词典。如果词典文件名和文档数量不发生变化,则不需要重启ES集群。

  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Elasticsearch实例
  3. 进入目标实例。
    1. 在顶部菜单栏处,选择资源组和地域。
    2. Elasticsearch实例中单击目标实例ID。
  4. 在左侧导航栏,选择配置与管理 > 插件配置

  5. 系统默认插件列表页签,找到analysis-ik插件,在其右侧的操作列中单击热更新

  6. IK词库配置-热更新控制面板,单击目标词典右侧的编辑,上传对应的词典文件后单击保存

    词典文件更新方式包括:

    • 上传本地文件:单击文件上传区域上传词典文件,或拖拽词典文件到上传区域。

    • 上传OSS文件:输入Bucket名称和词典文件名称,单击添加

      • Bucket与阿里云ES实例需要在同一地域。

      • 不支持自动同步更新词典文件。源端OSS中的词典文件内容发生变化后,需要通过热更新使之生效。

    说明
    • 词典文件后缀必须是.dic,文件名可以包含大小写字母、数字和下划线,长度不超过30个字符。

    • 如果您需要修改已上传的词典文件内容,可单击目标词典文件右侧的下载按钮图标,下载、修改词典文件,然后删除源词典文件并重新上传。

    • 支持上传多个词典文件,仅词典文件内容发生变化时集群不需要重启,文件名称或文件数量发生变化时需要集群重启。为保证您的业务不受影响,请在业务低峰期进行操作,等待重启结束后,词典会自动生效。

  7. 在页面底部,单击确定

    阿里云ES节点上的插件具有自动加载词典文件的功能,但每个节点获取词典文件的可能时间不同,请耐心等待词典生效。

  8. (可选)登录ES实例的Kibana控制台,测试词典是否生效。

    说明

    登录Kibana控制台,请参见登录Kibana控制台

    为保证准确性,在Kibana控制台的开发工具(Dev Tools)上多次执行以下命令进行验证。

    GET _analyze
    {
      "analyzer": "ik_smart",
      "text": ["您词典中包含的词"]
    }

    text的值为["计算机汉字输入方法"],则返回结果如下。

    {
      "tokens" : [
        {
          "token" : "计算机",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "汉字输入",
          "start_offset" : 3,
          "end_offset" : 7,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "方法",
          "start_offset" : 7,
          "end_offset" : 9,
          "type" : "CN_WORD",
          "position" : 2
        }
      ]
    }
                                

IK和Pinyin分词器结合使用示例

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 7.10.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 单击右上角的Dev tools
  3. Console中执行以下命令,创建索引并配置IK和Pinyin分词器。

    示例如下:

    PUT ik_pinyin
    {
      "settings":{
        "analysis": {
          "filter": {
            "my_pinyin" : {
                "type" : "pinyin",
                "keep_separate_first_letter" : false,
                "keep_full_pinyin" : true,
                "keep_original" : true,
                "limit_first_letter_length" : 16,
                "lowercase" : true,
                "remove_duplicated_term" : true
              }
          },
          "analyzer": {
            "ik_pinyin_analyzer": {
              "type": "custom",
              "tokenizer": "ik_max_word",
              "filter": ["my_pinyin"]
            }
          }
        }
      },
      "mappings":{
        "properties":{
          "text":{
            "type" : "text",
            "analyzer" : "ik_pinyin_analyzer"
          }
        }
      }
    }
    说明

    Pinyin分析插件的具体配置请参见Pinyin Analysis for Elasticsearch

  4. 验证分词效果。

    GET ik_pinyin/_analyze
    {
      "text": ["这是个测试"],
      "analyzer": "ik_pinyin_analyzer"
    }

    预期结果如下:

    {
      "tokens" : [
        {
          "token" : "zhe",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "shi",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "这是",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "zs",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "ge",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "CN_CHAR",
          "position" : 2
        },
        {
          "token" : "个",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "CN_CHAR",
          "position" : 2
        },
        {
          "token" : "g",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "CN_CHAR",
          "position" : 2
        },
        {
          "token" : "ce",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 3
        },
        {
          "token" : "shi",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 4
        },
        {
          "token" : "测试",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 4
        },
        {
          "token" : "cs",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 4
        }
      ]
    }

相关文档