IK分词插件(英文名为analysis-ik)是阿里云Elasticsearch的扩展插件,默认不能卸载。该插件在开源插件的基础上,扩展支持了对象存储服务OSS(Object Storage Service)词典文件的动态加载,可以实现IK词典的冷更新和热更新。本文介绍如何使用IK分词插件。

前提条件

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

使用限制

Elasticsearch 7.16及以上版本和部分地域的基于全新云原生管控的7.10版本实例不支持IK词典冷更新。

注意事项

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

词典冷热更新对比

阿里云Elasticsearch的IK分词插件支持IK词典冷更新IK词典热更新,两者区别如下。

更新方式生效方式加载方式说明
冷更新对整个集群的词典进行更新操作,需要重启集群才能生效。系统自动将上传的词典文件传送到Elasticsearch节点上,并修改IKAnalyzer.cfg.xml文件,然后重启Elasticsearch节点加载词典文件。IK词典冷更新支持修改IK自带的主词库和停用词主词库。在IK词典冷更新页面可以看到系统自带的主词典为SYSTEM_MAIN.dic,系统自带的停用词主词典为SYSTEM_STOPWORD.dic
重要 如果您需要自定义配置词库文件(IKAnalyzer.cfg.xml),可下载词典并修改后重新上传,具体操作请参见更新词库文件
热更新第一次上传词典文件时,会对整个集群的词典进行更新,需要重启集群才能生效;二次上传同名文件不会触发集群重启,在运行过程中直接加载词库。当词典文件内容发生变化时,上传词典文件后Elasticsearch节点能自动加载词典文件,实现词典的更新操作。

如果词典文件列表发生变化,例如上传新词典文件或删除词典文件,那么整个集群都需要重新加载词典的配置(因为会涉及到修改IKAnalyzer.cfg.xml文件)。

第一次上传词典文件时,系统会自动修改IKAnalyzer.cfg.xml文件,所以在更新词典后,需要重启集群才能生效。

词典文件说明

词典类型词典说明相关限制更新方式
主分词词典在Elasticsearch集群中创建索引时,如果指定了主分词词典,那么向集群中写入数据时,如果数据中包含主分词词典中的词,集群就会建立索引,并且该索引能通过关键词被查询到。
  • 每行一个词,保存为UTF-8编码的DIC文件。
  • 文件名包含大小写字母、数字和下划线,且长度不超过30个字符。
  • 不允许上传同名文件,主分词文件和停用词文件也不允许重名。
IK词典冷更新
停用词词典在Elasticsearch集群中创建索引时,如果指定了停用词词典,那么向集群中写入数据时,数据中包含的停用词词典中的词会被过滤掉。
阿里云Elasticsearch默认的停用词词库配置文件中,包含了一些默认的停用词,例如:a、an、and、are、as、at、be、but、by、for、if、in、into、is、it、no、not、of、on、or、such、that、the、their、then、there、these、they、this、to、was、will、with。如果您需要去掉一些不需要的默认停用词,可参见更新词库文件,下载并修改内容,然后将文件重命名为SYSTEM_STOPWORD.dic后重新上传。
说明 如果您需要使用中文停用词,可参考官方Elasticsearch默认的IK分词配置文件中config目录下的extra_stopword.dic文件。该文件中包含的停用词包括:也、了、仍、从、以、使、则、却、又、及、对、就、并、很、或、把、是、的、着、给、而、被、让、在、还、比、等、当、与、于、但。

IK词典冷更新

  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Elasticsearch实例
  3. 进入目标实例。
    1. 在顶部菜单栏处,选择资源组和地域。
    2. Elasticsearch实例中单击目标实例ID。
  4. 在左侧导航栏,选择配置与管理 > 插件配置
  5. 系统默认插件列表中,找到analysis-ik插件,单击其右侧操作列下的冷更新
    IK词典冷更新入口
  6. 冷更新页面,单击下方的配置
  7. IK主分词词库下方,选择词典的更新方式,并按照以下说明上传词典文件。
    IK主分词词库
    阿里云Elasticsearch支持上传DIC文件添加OSS文件两种词典更新方式:
    • 上传DIC文件:单击上传DIC文件,选择一个本地文件进行上传。
    • 添加OSS文件:输入Bucket名称和文件名称,单击添加

      请确保Bucket与当前阿里云Elasticsearch实例在同一地域下,且文件为DIC文件。当源端(OSS)的文件内容发生变化后,需要重新手动配置上传才能生效,不支持自动同步更新。

    警告 以下操作会重启实例,为保证您的业务不受影响,请确认后在业务低峰期进行操作。
  8. 滑动到页面底端,勾选该操作会重启实例,请确认后操作,单击保存
    无论是词典文件变化,还是词典内容发生变化,冷更新操作都会触发集群重启。
  9. 重启成功后,登录对应Elasticsearch实例的Kibana控制台,执行以下命令测试词典是否生效。
    登录控制台的具体操作步骤,请参见登录Kibana控制台
    GET _analyze
    {
      "analyzer": "ik_smart",
      "text": ["您词典中包含的词"]
    }
    正常情况下,系统会根据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分词插件的分词器包括ik_smart和ik_max_word,两者区别如下:
    • ik_max_word:将文本按照最细粒度进行拆分,适合术语查询。例如会将计算机汉字输入方法拆分为计算机,计算,算机,汉字输入,汉字,输入,方法
    • ik_smart:将文本按照粗粒度进行拆分,适合短语查询。例如会将计算机汉字输入方法拆分为计算机,汉字输入,方法

IK词典热更新

  1. 系统默认插件列表中,找到需要更新的IK插件,单击其右侧操作列下的热更新
    IK词典热更新入口
  2. 热更新页面,单击右下方的配置
  3. IK主分词词库下方,选择词典的更新方式,并按照以下说明上传词典文件。
    插件配置
    说明 IK热更新不支持修改系统自带的主词典,如果您需要修改系统主词典请使用IK冷更新的方式。
    阿里云Elasticsearch支持上传DIC文件添加OSS文件两种词典更新方式:
    • 上传DIC文件:单击上传DIC文件,选择一个本地文件进行上传。
    • 添加OSS文件:输入Bucket名称和文件名称,单击添加

      请确保Bucket与当前Elasticsearch实例在同一地域下,且文件为DIC文件(以下步骤以dic_0.dic文件进行说明)。且源端(OSS)的文件内容发生变化后,需要重新手动配置上传才能生效,不支持自动同步更新。

    警告 以下操作会重启实例,为保证您的业务不受影响,请确认后在业务低峰期进行操作。
  4. 滑动到页面底端,勾选该操作会重启实例,请确认后操作(第一次上传词典文件,需要重启),单击保存

    保存后,集群会进行滚动重启,等待滚动重启结束后,词典会自动生效。

    词典使用一段时间后,如果需要扩充或者减少词典中的内容,请继续执行以下步骤修改上传的dic_0.dic文件。

  5. 进入词典热更新页面,先删除之前上传的同名词典文件,重新上传修改过的dic_0.dic同名词典文件。
    因为修改的是已存在的同名词典文件的内容,所以本次上传修改过的同名词典文件不需要滚动重启整个集群。
  6. 单击保存
    由于阿里云Elasticsearch节点上的插件具有自动加载词典文件的功能,所以每个节点获取词典文件的可能时间不同,请耐心等待词典生效。大概两分钟后再使用更新之后的词典,为了保证准确性,请登录Kibana控制台,多次执行以下命令进行验证。
    说明 登录Kibana控制台的具体步骤,请参见登录Kibana控制台
    GET _analyze
    {
      "analyzer": "ik_smart",
      "text": ["您词典中包含的词"]
    }
    正常情况下,系统会根据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
        }
      ]
    }
                                

更新词库文件

如果您需要更新已经上传的词库文件,可直接下载对应文件,修改后重新上传。以SYSTEM_STOPWORD.dic为例,更新词库文件的步骤如下:

  1. 系统默认插件列表中,找到analysis-ik插件,单击其右侧操作列下的冷更新
    IK词典冷更新入口
  2. 冷更新面板中,单击IK停用词库SYSTEM_STOPWORD.dic文件对应的下载按钮图标。
    下载按钮位置
    重要 进行IK词典冷更新时,系统不支持删除自带的主词典和停用词主词典,但可以修改。 修改方式如下:
    • 如果需要修改系统自带的主词典文件,请上传以SYSTEM_MAIN.dic命名的主词典,系统会自动覆盖原始内容。详细信息,请参见IK Analysis for Elasticsearch
    • 如果需要修改系统自带的停用词主词典文件,请上传以SYSTEM_STOPWORD.dic命名的停用词主词典,系统会自动覆盖原始内容。详细信息,请参见IK Analysis for Elasticsearch
  3. 修改已下载的文件,并重新上传。
    上传操作请参见IK词典冷更新或者IK词典热更新中对应的步骤。

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

相关文档