IK中文分词插件与动态更新词典
所有文档

          Elasticsearch BES

          IK中文分词插件与动态更新词典

          IK中文分词插件(英文名为analysis-ik)是百度智能云Elasticsearch默认安装的中文分词插件。

          本文介绍了IK 中文分词插件的使用方法动态更新IK词典的方法。

          使用方法

          分词粒度

          analysis-ik主要提供两种粒度的Analyzer

          1. ik_max_word:会将文本做最细粒度的拆分;尽可能多的拆分出词语
          2. ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有

          同名提供两种Tokenizer

          1. ik_max_word
          2. ik_smart

          切词效果

          ik_max_word的切词效果如下:

          POST /_analyze
          {
            "analyzer": "ik_max_word",
            "text":     "百度校园夏令营"
          }
          {
             "tokens": [
                {
                   "token": "百度",
                   "start_offset": 0,
                   "end_offset": 2,
                   "type": "CN_WORD",
                   "position": 0
                },
                {
                   "token": "百",
                   "start_offset": 0,
                   "end_offset": 1,
                   "type": "TYPE_CNUM",
                   "position": 1
                },
                {
                   "token": "度",
                   "start_offset": 1,
                   "end_offset": 2,
                   "type": "COUNT",
                   "position": 2
                },
                {
                   "token": "校园",
                   "start_offset": 2,
                   "end_offset": 4,
                   "type": "CN_WORD",
                   "position": 3
                },
                {
                   "token": "夏令营",
                   "start_offset": 4,
                   "end_offset": 7,
                   "type": "CN_WORD",
                   "position": 4
                },
                {
                   "token": "夏令",
                   "start_offset": 4,
                   "end_offset": 6,
                   "type": "CN_WORD",
                   "position": 5
                },
                {
                   "token": "夏",
                   "start_offset": 4,
                   "end_offset": 5,
                   "type": "CN_WORD",
                   "position": 6
                },
                {
                   "token": "令",
                   "start_offset": 5,
                   "end_offset": 6,
                   "type": "CN_CHAR",
                   "position": 7
                },
                {
                   "token": "营",
                   "start_offset": 6,
                   "end_offset": 7,
                   "type": "CN_CHAR",
                   "position": 8
                }
             ]
          }

          ik_smart的切词效果如下:

          POST /_analyze
          {
            "analyzer": "ik_smart",
            "text":     "百度校园夏令营"
          }
          {
             "tokens": [
                {
                   "token": "百度",
                   "start_offset": 0,
                   "end_offset": 2,
                   "type": "CN_WORD",
                   "position": 0
                },
                {
                   "token": "校园",
                   "start_offset": 2,
                   "end_offset": 4,
                   "type": "CN_WORD",
                   "position": 1
                },
                {
                   "token": "夏令营",
                   "start_offset": 4,
                   "end_offset": 7,
                   "type": "CN_WORD",
                   "position": 2
                }
             ]
          }

          动态更新词典

          配置词典

          当IK自身带的词库不满足需求时,用户可以自己定义词库。步骤如下:

          • 用户把编辑好的词库放到一个http服务器上。需要注意的是,务必保证Elasticsearch所在节点能够访问该http服务,否则无法下载安装。
          • 用户在Elasticsearch里配置ik词库的http地址,比如自定义词库的配置文件是baidu.dict,停用词的配置文件是baidu_stop.dic时,我们向Elasticsearch发送的命令如下:
          PUT /_cluster/settings
          {
              "persistent": {
                  "bpack.ik_analyzer.remote_ext_dict":"http://ip:port/baidu.dic",
                  "bpack.ik_analyzer.remote_ext_stopwords":"http://ip:port/baidu_stop.dic"
              }
          }
          • Elasticsearch会每隔60s检测一下setting中http url指向的词库文件是否发生变化,如果变化了,那么es就会自动下载这个文件,然后加载到ik中。

          验证词库是否生效

          当配置好后,用户可以通过POST /_analyze 来检测词库是否生效,比如:

          • 在没有配置词库之前,我们发送命令:
          POST /_analyze
          {
            "analyzer" : "ik_smart",
            "text" : ["赵小明明真帅"]
          }

          Elasticsearch的返回结果是:

          	{
          	   "tokens": [
          	      {
          	         "token": "赵",
          	         "start_offset": 0,
          	         "end_offset": 1,
          	         "type": "CN_WORD",
          	         "position": 0
          	      },
          	      {
          	         "token": "小明",
          	         "start_offset": 1,
          	         "end_offset": 3,
          	         "type": "CN_WORD",
          	         "position": 1
          	      },
          	      {
          	         "token": "明",
          	         "start_offset": 3,
          	         "end_offset": 4,
          	         "type": "CN_WORD",
          	         "position": 2
          	      },
          	      {
          	         "token": "真帅",
          	         "start_offset": 4,
          	         "end_offset": 6,
          	         "type": "CN_WORD",
          	         "position": 3
          	      }
          	   ]
          	}
          • 然后我们配置一下词库,其中正常词库里只包含 "赵小明明", 停用词词库中包含 "真帅",配置完之后,我们再次调用 POST /_analyze,结果如下:
          {
             "tokens": [
                {
                   "token": "赵小明明",
                   "start_offset": 0,
                   "end_offset": 4,
                   "type": "CN_WORD",
                   "position": 0
                }
             ]
          }

          结果显示, “赵小明明” 被当做一个单独的词,而 "真帅" 由于是停用词所以没有被分词。

          上一篇
          Elasticsearch插件列表
          下一篇
          analysis-pinyin拼音分词插件