ik分词器

ik分词器

来源 :ES默认的分词器是认为母语为英语,英语的书写格式是按照空格为词,并且连词为AND THIS OR...,中文的一句话是没有空格的,中国文化博大精深连词都不止其他语言的那么几个,这就要有一个强大的中文词库,当你的内容中出现这个词时,就会将这个词提炼出来。这里大家也不用重复造轮子,经过前辈的努力,这个中文的分词器已经有了,它就是今天要给大家介绍的IK中文分词器

安装

ES是默认没有安装ik分词器的,如果工作中用的是阿里云服务的elasticsearch的话是会默认安装,这里仅供自身学习,所以可以在对应GitHub上下载对应的ik分词器 :https://github.com/medcl/elasticsearch-analysis-ik/releases
附上另一博主的网盘,有es7.6.1全家桶 https://blog.csdn.net/qq_42359314/article/details/105670912

下载完毕之后在es项目的${ES_HOME}/plugins创建文件名为ik的目录,随后将zip解压至该文件中
重启es,观察日志:

loaded plugin [analysis-ik]`
[2020-11-10T00:11:00,351][INFO ][o.w.a.d.Monitor          ] [DESKTOP-FE6V42L] try load config from G:\elasticsearch\elasticsearch-7.6.1\config\analysis-ik\IKAnalyzer.cfg.xml
[2020-11-10T00:11:00,359][INFO ][o.w.a.d.Monitor          ] [DESKTOP-FE6V42L] try load config from G:\elasticsearch\elasticsearch-7.6.1\plugins\ik\config\IKAnalyzer.cfg.xml

那么es已经加载了上了ik分词器

使用

先介绍一下ES的分析器接口,指定了分析器和文本的内容,我们就可以看到分词的结果

GET _analyze
{
 "analyzer": {分析器名称},
 "text": {要被分词的文档}
}

结果

IK中文分词器插件给我们提供了两个分析器

  • ik_max_word: 会将文本做最细粒度的拆分
  • ik_smart:会做最粗粒度的拆分
    分别看下各自的效果

对应的 ik_smart就分的比较粗了,只是大致的拆分了文本

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "上海自来水来自海上"
}

结果:
{
  "tokens" : [
    {
      "token" : "上海",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "自来水",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "来自",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "海上",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 3
    }
  ]
}

我们可以看到,ik_max_word分词分的非常细,我们在使用上面的这些进行搜索时,都可以搜索到对应的文本

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "上海自来水来自海上"
}

结果
{
  "tokens" : [
    {
      "token" : "上海",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "自来水",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "自来",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "水",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "来自",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "海上",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 5
    }
  ]
}

配置

同样,如果我们用ik分析器来分析 简书就会发现,本应该是一个名字的文本,被分词器分析成两个字

GET _analyze
{
 "analyzer": "ik_smart",
 "text": "简书"
}

GET _analyze
{
 "analyzer": "ik_max_word",
 "text": "简书"
}

同样的返回结果

{
 "tokens" : [
   {
     "token" : "简",
     "start_offset" : 0,
     "end_offset" : 1,
     "type" : "CN_CHAR",
     "position" : 0
   },
   {
     "token" : "书",
     "start_offset" : 1,
     "end_offset" : 2,
     "type" : "CN_CHAR",
     "position" : 1
   }
 ]
}

但是在日常工作中我们有许多的业务名词,我们不期望使用es搜索的时候被ik分词器拆分成单个汉字,这时候我们就需要来配置ik分词器的字典:
配置项如下: ${ES_HOME}\plugins\ik\config\IKAnalyzer.cfg.xml

<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict"></entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
  • 字典 :扩展字典中的词会被筛选出来
  • 停止词字典 :扩展停止词中的词会被过滤掉

即可以在\IKAnalyzer.cfg.xml的相对目录下新建对应的定制字典 如biz.dic
一定要注意dic的编码格式

简书
我是简书
博主

配置进xml中<entry key="ext_dict">biz.dic</entry> 重启es生效,随后就会看到文本的分词不一样了
被加载:
[2020-11-10T00:49:27,608][INFO ][o.w.a.d.Monitor ] [DESKTOP-FE6V42L] [Dict Loading] G:\elasticsearch\elasticsearch-7.6.1\plugins\ik\config\biz.dic
输出的结果:

{
  "tokens" : [
    {
      "token" : "简书",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    }
  ]
}

创建索引时指定IK分词器

我们在创建索引时就可以为text类型的字段指定IK中文分词器了

PUT ik_index
{
    "mappings": {
        "properties": {
            "id": {
                "type": "long"
            },
            "title": {
                "type": "text",
                "analyzer": "ik_max_word"
            }
        }
    }
}

为索引指定默认IK分词器

PUT ik_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "ik_max_word"
        }
      }
    }
  }
}

以上就是个人理解整理的ik分词器内容
附上精彩文章:
[ik分词器词典加载原理] (//www.greatytc.com/p/e7f80fda5dd4?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容