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
}
]
}
从结果中可以看出,就不会把我自定义的词汇给拆分开了。简单的分词用法就写到这里。
如果有什么好的建议或者意见请关注公众号