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环境下:
$ cd /usr/share/elasticsearch-6.5.0/plugins
$ wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v6.5.0.tar.gz
$ tar -xvzf v6.5.0.tar.gz
复制代码
安装成功后重启ES
$ ps -ef | grep elasticsearch
$ kill -9 [进程号]
$ 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下。
"1.0" encoding="UTF-8"?>
"http://java.sun.com/dtd/properties.dtd">
IK Analyzer 扩展配置
"ext_dict">my.dic
"ext_stopwords">
复制代码
重启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
}
]
}
复制代码
从结果中可以看出,就不会把我自定义的词汇给拆分开了。简单的分词用法就写到这里。
如果有什么好的建议或者意见请关注公众号