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

重要

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

IK分词插件(analysis-ik)是阿里云Elasticsearch(简称ES)提供的中文分词扩展插件,内置多种类型的默认词典,可直接使用。您也可根据业务需求灵活更新词典,自定义IK分词插件的默认词库或添加新的词库,从而优化分词效果,使分词结果更贴合实际应用场景。IK分词插件支持从对象存储OSS动态加载词典文件,实现远程管理,提升运维效率。本文为您介绍IK分词插件的分词规则、词典类型,以及如何更新词典并使用插件。

背景信息

IK分词插件的主要组成部分包括分词器、多种词典文件、词典更新机制。

  • 分词器:负责将中文文本拆分为有意义的词语(Token),决定分词粒度。

  • 词典文件:提供词汇基础,分词器需基于词典文件进行分词,支持扩展和定制。

  • 词典更新方式:支持冷更新和热更新两种方式,允许您根据实际情况灵活调整词库,确保分词效果符合业务需求。

分词规则

IK分词插件的分词器支持的分词规则如下:

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

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

词典类型

IK分词插件支持的词典类型及相关介绍如下。

词典类型

描述

词典文件要求

支持的更新方式

主词典

默认内置的主词典为main.dic,包含27多条中文词语。

若在创建ES索引时指定了主分词词典,则向索引中写入数据时,集群会将该数据与主分词词典中的词进行匹配,并将匹配到的词建立索引,该索引可通过相应的关键词被检索到。

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

停用词词典

默认内置的停用词词典为stopword.dic,包含英文停用词,例如,atheandatbut等。

若在创建ES索引时指定了停用词词典,则向索引中写入数据时,集群会将该数据与停用词词典中的词进行匹配,并将匹配到的词过滤,被过滤的词不会出现在倒排索引中。

说明

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

介词词典

默认内置的介词词典为preposition.dic,存放介词。用于帮助分词器切分介词与后续词汇。

不涉及

冷更新

量词词典

默认内置的量词词典为quantifier.dic,存放单位相关的词和量词。用于帮助分词器识别量词与名词组合。

suffix.dic

存放后缀词,用于帮助分词器切分带有后缀的词汇。

不涉及

不支持更新

surname.dic

存放中国的姓氏,用于帮助分词器识别人名。

词典更新方式

若默认的词典不符合您的业务需要,您也可按需更新词典。IK分词插件支持的词典更新方式如下。

更新方式

描述

适用场景

冷更新

通过重启ES集群来使词典变更生效。该方式会对整个集群的词典进行更新。

系统将上传的词典文件传送到ES节点,然后重启ES节点加载词典文件。重启完成后,新配置即可生效。

  • 替换默认词典文件或删除默认词典文件中的内容。

  • 更新介词词典或量词词典文件。

热更新

  • 若已有词典的内容发生变更,不会触发集群重启,集群会在运行过程中直接加载新词库,实现词典的动态更新。

  • 若已有词典的名称发生变化,或词典文件列表发生变化(即新增或删除词典文件),会触发集群通过重启来重新加载词典配置。重启完成后,新配置即可生效。

说明

仅支持变更主词典或停用词词典。

  • 扩充主词典或停用词词典文件,即除默认的主词典或停用词词典外,需新增其他的扩展主词典或停用词词典。

  • 变更已有主词典或停用词词典文件(包括默认词典及扩展词典)的内容。

前提条件

  • 请确保实例状态正常。您可在实例的基本信息页面查看实例状态

    说明

    本文操作均使用阿里云ES7.10.0版本实例展示。不同版本实例的控制台界面和支持的功能可能存在差异,具体请以实际控制台界面为准。

  • (可选)如需更新词典,请执行如下操作。

    • 通过上传OSS文件方式更新:请先创建OSS Bucket上传所需词典文件。

    • 通过上传本地文件方式更新:请先将所需词典文件保存至本地。

更新IK词典

若默认的IK词典不满足您的业务需求,您可按需进行词典更新。执行更新操作前,请提前了解相应更新方式。对于已配置IK分词的索引,更新词典后,将只对新数据(包含新增数据和更新后的数据)生效,若您希望对全部数据生效,需重新创建索引。

冷更新

IK词典冷更新操作如下:

警告

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

  1. 进入实例详情页。

    1. 登录阿里云Elasticsearch控制台

    2. 在左侧导航栏,单击Elasticsearch实例

    3. 在顶部菜单栏,选择资源组和地域。

    4. Elasticsearch实例列表单击目标实例ID,进入实例详情页。

  2. 进入analysis-ik插件的冷更新页面。

    1. 在左侧导航栏,选择配置与管理 > 插件配置

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

  3. 执行冷更新操作。

    1. IK词库配置-冷更新对话框,单击目标词典右侧的编辑,按照界面指引上传所需的词典文件后单击保存

      您可通过如下方式上传词典文件:

      • 上传本地文件:按照界面指引,单击image图标或通过拖拽方式上传本地文件。

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

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

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

      说明
    2. 勾选风险提示并单击确定,重启实例。

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

  4. (可选)测试词典是否生效。

    1. 登录Kibana控制台

    2. 单击左上角的image图标,选择Management > 开发工具,进入代码编辑页面。

      示例执行如下代码,对输入文本计算机汉字输入方法进行粗粒度切分。

      说明

      实际使用时,请将text的内容替换为您词典中包含的词。

      GET _analyze
      {
        "analyzer": "ik_smart",
        "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词典热更新操作如下:

说明

仅文件内容变更无需重启集群。若文件数量或文件名称变更,仍需重启集群,为保证您的业务不受影响,请在业务低峰期进行操作,重启成功后,词典会自动生效。

  1. 进入实例详情页。

    1. 登录阿里云Elasticsearch控制台

    2. 在左侧导航栏,单击Elasticsearch实例

    3. 在顶部菜单栏,选择资源组和地域。

    4. Elasticsearch实例列表单击目标实例ID,进入实例详情页。

  2. 进入analysis-ik插件的热更新页面。

    1. 在左侧导航栏,选择配置与管理 > 插件配置

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

  3. 执行热更新操作。

    1. IK词库配置-热更新对话框,单击目标词典右侧的编辑,按照界面指引上传所需的词典文件后单击保存

      您可通过如下方式上传词典文件:

      • 上传本地文件:按照界面指引,单击image图标或通过拖拽方式上传本地文件。

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

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

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

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

      • 如需修改已上传词典的文件内容,可单击目标词典文件右侧的下载按钮图标,下载并修改词典文件,然后删除原词典文件并重新上传。注意删除原词典文件后,需单击保存,否则上传时会提示已存在同名文件。

    2. 单击确定,等待ES节点完成词典加载。

      阿里云ES节点的插件具有自动加载词典文件的功能,但每个节点获取词典文件的时间存在差异。加载完成后,词典即可生效,请耐心等待。

  4. (可选)测试词典是否生效。

    1. 登录Kibana控制台

    2. 单击左上角的image图标,选择Management > 开发工具,进入代码编辑页面。

      示例执行如下代码,对输入文本计算机汉字输入方法进行粗粒度切分。

      说明

      实际使用时,请将text的内容替换为您词典中包含的词。

      GET _analyze
      {
        "analyzer": "ik_smart",
        "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分词插件

本文示例使用IK分词器及Pinyin过滤器对指定文本进行分词。

  1. 进入ES实例的Kibana开发工具页面。

    1. 登录Kibana控制台

    2. 单击左上角的image图标,选择Management > 开发工具,进入代码编辑页面。

  2. 创建索引并配置IK分词器及Pinyin过滤器。

    在开发工具页面执行如下命令,创建ik_pinyin索引,并自定义分析器ik_pinyin_analyzer。该分析器使用细粒度的分词规则ik_max_word,同时,配置拼音过滤器,可将中文词转换为拼音。

    说明

    拼音过滤器会在中文分词完成后执行,即系统优先进行中文分词,然后再将分词结果转化为拼音一并输出。

    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"
          }
        }
      }
    }

    核心参数说明如下:

    • 拼音过滤器(即filter

      说明

      Pinyin分析插件的更多配置,请参见Pinyin Analysis for Elasticsearch

      参数

      描述

      my_pinyin

      表示您定义的拼音过滤器名称。

      type

      配置为pinyin,表示拼音过滤器。

      keep_separate_first_letter

      配置为false,表示不保留每个字的首字母。

      keep_full_pinyin

      配置为true,表示保留完整的拼音。

      keep_original

      配置为true,表示保留原始输入文本。

      limit_first_letter_length

      配置为16,表示限制首字母长度不超过16个字符。

      lowercase

      配置为true,表示输出的拼音使用小写。

      remove_duplicated_term

      配置为true,表示去除重复词。例如,避免出现“zh,zh”

    • 分析器(即analyzer):

      参数

      描述

      ik_pinyin_analyzer

      表示您定义的分析器名称。

      type

      配置为custom,表示自定义分析器。

      tokenizer

      配置为ik_max_word,表示将文本按照最细粒度进行拆分。

      filter

      配置为my_pinyin,表示调用拼音过滤器my_pinyin

      返回下图结果,表示创建成功。image

  3. 验证分词效果。

    执行如下代码,对输入文本这是个测试进行分词。

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

    预期的返回结果如下。

    {
      "tokens" : [
        {
          "token" : "zhe",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "这是",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "zs",
          "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" : "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
        }
      ]
    }
    

相关文档