本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
IK分词插件(analysis-ik)是阿里云Elasticsearch(简称ES)提供的中文分词扩展插件,内置多种类型的默认词典,可直接使用。您也可根据业务需求灵活更新词典,自定义IK分词插件的默认词库或添加新的词库,从而优化分词效果,使分词结果更贴合实际应用场景。IK分词插件支持从对象存储OSS动态加载词典文件,实现远程管理,提升运维效率。本文为您介绍IK分词插件的分词规则、词典类型,以及如何更新词典并使用插件。
背景信息
IK分词插件的主要组成部分包括分词器、多种词典文件、词典更新机制。
分词器:负责将中文文本拆分为有意义的词语(Token),决定分词粒度。
词典文件:提供词汇基础,分词器需基于词典文件进行分词,支持扩展和定制。
词典更新方式:支持冷更新和热更新两种方式,允许您根据实际情况灵活调整词库,确保分词效果符合业务需求。
分词规则
IK分词插件的分词器支持的分词规则如下:
ik_max_word:将文本按照最细粒度进行拆分,适合术语查询。例如,会将输入文本
计算机汉字输入方法
拆分为计算机,计算,算机,汉字输入,汉字,输入,方法
。ik_smart:将文本按照粗粒度进行拆分,适合短语查询。例如,会将
计算机汉字输入方法
拆分为计算机,汉字输入,方法
。
词典类型
IK分词插件支持的词典类型及相关介绍如下。
词典类型 | 描述 | 词典文件要求 | 支持的更新方式 |
主词典 | 默认内置的主词典为 若在创建ES索引时指定了主分词词典,则向索引中写入数据时,集群会将该数据与主分词词典中的词进行匹配,并将匹配到的词建立索引,该索引可通过相应的关键词被检索到。 | 每行一个词,保存为 | |
停用词词典 | 默认内置的停用词词典为 若在创建ES索引时指定了停用词词典,则向索引中写入数据时,集群会将该数据与停用词词典中的词进行匹配,并将匹配到的词过滤,被过滤的词不会出现在倒排索引中。 说明 如需使用中文停用词,可参考官方ES默认的IK分词配置文件中Config目录下的 | ||
介词词典 | 默认内置的介词词典为 | 不涉及 | |
量词词典 | 默认内置的量词词典为 | ||
suffix.dic | 存放后缀词,用于帮助分词器切分带有后缀的词汇。 | 不涉及 | 不支持更新 |
surname.dic | 存放中国的姓氏,用于帮助分词器识别人名。 |
词典更新方式
若默认的词典不符合您的业务需要,您也可按需更新词典。IK分词插件支持的词典更新方式如下。
更新方式 | 描述 | 适用场景 |
通过重启ES集群来使词典变更生效。该方式会对整个集群的词典进行更新。 系统将上传的词典文件传送到ES节点,然后重启ES节点加载词典文件。重启完成后,新配置即可生效。 |
| |
说明 仅支持变更主词典或停用词词典。 |
|
前提条件
请确保实例状态正常。您可在实例的基本信息页面查看实例状态。
说明本文操作均使用阿里云ES
7.10.0
版本实例展示。不同版本实例的控制台界面和支持的功能可能存在差异,具体请以实际控制台界面为准。(可选)如需更新词典,请执行如下操作。
通过上传OSS文件方式更新:请先创建OSS Bucket并上传所需词典文件。
通过上传本地文件方式更新:请先将所需词典文件保存至本地。
更新IK词典
若默认的IK词典不满足您的业务需求,您可按需进行词典更新。执行更新操作前,请提前了解相应更新方式。对于已配置IK分词的索引,更新词典后,将只对新数据(包含新增数据和更新后的数据)生效,若您希望对全部数据生效,需重新创建索引。
冷更新
IK词典冷更新操作如下:
冷更新操作会触发集群重启,为保证您的业务不受影响,请在业务低峰期进行操作。
进入实例详情页。
在左侧导航栏,单击Elasticsearch实例。
在顶部菜单栏,选择资源组和地域。
在Elasticsearch实例列表单击目标实例ID,进入实例详情页。
进入
analysis-ik
插件的冷更新页面。在左侧导航栏,选择
。在系统默认插件列表页签,找到
analysis-ik
插件,单击右侧操作列的冷更新。
执行冷更新操作。
在IK词库配置-冷更新对话框,单击目标词典右侧的编辑,按照界面指引上传所需的词典文件后单击保存。
您可通过如下方式上传词典文件:
上传本地文件:按照界面指引,单击
图标或通过拖拽方式上传本地文件。
上传OSS文件:输入Bucket名称和词典文件名称,单击添加。
Bucket与阿里云ES实例需在同一地域。
不支持自动同步更新OSS中的词典文件。若源端OSS中的词典文件内容发生变化,需通过IK词典更新操作使之生效。
说明每种类型的词典仅支持上传一个
DIC
格式的文件,且变更发起后会使用当前上传的词典替换原词典。词典文件后缀必须是
.dic
,文件名可包含大小写字母、数字和下划线,长度不超过30个字符。如需恢复词典的默认文件,可下载默认词典文件后重新上传。获取默认词典文件,请参考:
勾选风险提示并单击确定,重启实例。
ES实例重启成功后,词典文件即更新成功。
(可选)测试词典是否生效。
单击左上角的
图标,选择 ,进入代码编辑页面。
示例执行如下代码,对输入文本
计算机汉字输入方法
进行粗粒度切分。说明实际使用时,请将
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词典热更新操作如下:
仅文件内容变更无需重启集群。若文件数量或文件名称变更,仍需重启集群,为保证您的业务不受影响,请在业务低峰期进行操作,重启成功后,词典会自动生效。
进入实例详情页。
在左侧导航栏,单击Elasticsearch实例。
在顶部菜单栏,选择资源组和地域。
在Elasticsearch实例列表单击目标实例ID,进入实例详情页。
进入
analysis-ik
插件的热更新页面。在左侧导航栏,选择
。在系统默认插件列表页签,找到
analysis-ik
插件,单击右侧操作列的热更新。
执行热更新操作。
在IK词库配置-热更新对话框,单击目标词典右侧的编辑,按照界面指引上传所需的词典文件后单击保存。
您可通过如下方式上传词典文件:
上传本地文件:按照界面指引,单击
图标或通过拖拽方式上传本地文件。
上传OSS文件:输入Bucket名称和词典文件名称,单击添加。
Bucket与阿里云ES实例需在同一地域。
不支持自动同步更新OSS中的词典文件。若源端OSS中的词典文件内容发生变化,需通过IK词典更新操作使之生效。
说明支持上传多个词典文件。词典文件后缀必须是
.dic
,文件名可包含大小写字母、数字和下划线,长度不超过30个字符。如需修改已上传词典的文件内容,可单击目标词典文件右侧的
图标,下载并修改词典文件,然后删除原词典文件并重新上传。注意删除原词典文件后,需单击保存,否则上传时会提示已存在同名文件。
单击确定,等待ES节点完成词典加载。
阿里云ES节点的插件具有自动加载词典文件的功能,但每个节点获取词典文件的时间存在差异。加载完成后,词典即可生效,请耐心等待。
(可选)测试词典是否生效。
单击左上角的
图标,选择 ,进入代码编辑页面。
示例执行如下代码,对输入文本
计算机汉字输入方法
进行粗粒度切分。说明实际使用时,请将
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过滤器对指定文本进行分词。
进入ES实例的Kibana开发工具页面。
单击左上角的
图标,选择 ,进入代码编辑页面。
创建索引并配置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
。返回下图结果,表示创建成功。
验证分词效果。
执行如下代码,对输入文本
这是个测试
进行分词。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 } ] }
相关文档
IK词典热更新相关API:UpdateHotIkDicts
IK词典冷更新相关API:UpdateDict