Elasticsearch-analysis-ik分词器的安装及使用

1,798 阅读3分钟

Elasticsearch-analysis-ik分词器的安装及使用

前面我们讲到了Elasticsearch的安装以及一些简单的操作语法。今天我们介绍一下怎么使用Elasticsearch-analysis-ik分词器实现一个简单的中文分词。

Elasticsearch 内置的分词器对中文不友好,会把中文分成单个字来进行全文检索,不能达到想要的结果,在全文检索及新词发展如此快的互联网时代,IK可以进行友好的分词及自定义分词。

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版,目前支持最新版本的ES6.X版本。

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

安装Elasticsearch-analysis-ik

Centos环境下:

<!-- 切换到elasticsearch安装目录下的plugins目录下 -->
$ cd /usr/share/elasticsearch-6.5.0/plugins
<!-- 下载分词器包 【注意:一定要下载和ES相同的版本;不然会出错,我们这里是6.5.0;】-->
$ wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v6.5.0.tar.gz
<!-- 解压 -->
$ tar -xvzf v6.5.0.tar.gz

安装成功后重启ES

<!-- 列出进程号[注意我们在centos是新建的一个用户(es)来启动ES的] -->
$ ps -ef | grep elasticsearch
<!-- kill掉以前的进程 -->
$ kill -9 [进程号]
<!-- 重启ES -->
$ su es 
$ cd /usr/share/elasticsearch/bin
$ ./elasticsearch -d
简单测试
curl -H 'Content-Type:application/json' 'http://localhost:9200/index/_analyze?pretty=true' -d'
{ "analyzer": "ik_smart", "text": "中华人民共和国万岁万岁万万岁"}'

看一下结果

{
  "tokens" : [
    {
      "token" : "中华人民共和国",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "万岁",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "万岁",
      "start_offset" : 9,
      "end_offset" : 11,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "万万岁",
      "start_offset" : 11,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 3
    }
  ]
}

可以看出。我们实现了简单的中文分词
但是我们想要一些特定的分词功能呢?比如说自己定义的一些名词,不想让分词器拆分怎么办呢?比如说这里的筱筱,我就不想让他拆分开怎么办呢?

curl -H 'Content-Type: application/json'  -XGET 'localhost:9200/_analyze?pretty' -d '{"analyzer":"ik_smart","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
    },
    {
      "token" : "的",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
      "token" : "公众",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "号",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "CN_CHAR",
      "position" : 4
    }
  ]
}

遇到这种情况,我们可以使用analysis-ik 支持自定义词库;增加自定义词库。

analysis-ik自定义词库

进入ES安装目录下的config/analysis-ik目录。

$ cd /usr/share/elasticsearch/config/analysis-ik

新建自定义词库文件

$ vi my.dic
<!-- 进入编辑模式,输入自定义词汇 -->
筱筱
:wq

修改IKAnalyzer.cfg.xml配置文件

$ vim IKAnalyzer.cfg.xml

文件内容如下,将新建的my.dic文件放入ext_dict下。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">my.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

重启ES

在进行验证刚刚的例子

 curl -H 'Content-Type: application/json'  -XGET 'localhost:9200/_analyze?pretty' -d '{"analyzer":"ik_smart","text":"筱筱的公众号"}'

结果如下:

{
  "tokens" : [
    {
      "token" : "筱筱",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "的",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "公众",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "号",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "CN_CHAR",
      "position" : 3
    }
  ]
}

从结果中可以看出,就不会把我自定义的词汇给拆分开了。简单的分词用法就写到这里。

如果有什么好的建议或者意见请关注公众号