1.简介
ElasticSearch默认自带的分词器,是标准分词器,对英文分词比较友好,但是对中文,只能把汉字一个个拆分。而elasticsearch-analysis-ik分词器能针对中文词项颗粒度进行粗细提取,所以对中文搜索是比较友好的。IK分词器有两种类型ik_smart和ik_max_word,前者提取词项粒度最粗,后者最细。而ElasticSearch默认并不支持IK分词器,需要自己安装。
2.前期准备
2.1下载elasticsearch-analysis-ik分词器组件
到GitHub下载页https://github.com/medcl/elasticsearch-analysis-ik/releases
下载elasticsearch-analysis-ik-7.8.0版本(因为我的elasticsearch版本是7.8,所以这里IK分词器组件对应下载版本也是7.8),如图所示:
3.ik分词器部署
3.1创建ik分词器文件夹
在elasticsearch/elasticsearch-7.8.0/plugins目录下创建ik分词器文件夹(文件夹名称一定要命名为ik,不然启动elasticsearch时候会报错的),创建文件夹命令如下:
mkdir /home/deng/elasticsearch/elasticsearch-7.8.0/plugins/ik
再通过Xftp把之前下载好的elasticsearch-analysis-ik-7.8.0.tar.gz安装包传输到installpackage中:
3.2解压ik分词器安装包
先切换到ik文件夹目录:
cd /home/deng/elasticsearch/elasticsearch-7.8.0/plugins/ik
把elasticsearch-analysis-ik安装包解压到ik目录当中。本人这里演示是先在本地先解压elasticsearch-analysis-ik-7.8.0.zip安装包,然后再通过Xftp复制文件传输到服务端的ik文件夹中,当然大伙也可以直接使用命令解压,这里就不详说了,解压后如图所示:
解压完ik分词器安装包后,重启elasticsearch。
4.测试ik分词
4.1ElasticSearch标准分词
在测试ik分词之前,我们通过kibana的dev_tools工具来看看elasticsearch自带标准分词器效果:
POST _analyze
{
"text": ["LM358"]
}
POST _analyze
{
"text": ["LM358,LM"]
}
POST _analyze
{
"text": ["LM358 LM"]
}
POST _analyze
{
"text": ["我是中国人!"]
}
通过上面效果图,我们知道ElasticSearch标准分词器只会把大部分符号跟空格符作为分词标准从而拆分词项,而对中文则是将每个词作为标准拆分,所以ElasticSearch标准分词并不能满足常见中文搜索业务,而这时候ik分词器就能发挥它的作用了,下面我们再来看看IK分词效果就会明白了。
4.2ik分词
在简介里面介绍过ik分词器有两种分词类型ik_smart和ik_max_word,前者提取词项粒度最粗,后者最细。下面我们同样通过kibana的dev_tools工具来看看ik分词器效果:
POST _analyze
{
"analyzer":"ik_smart",
"text": ["我是中国人!"]
}
POST _analyze
{
"analyzer":"ik_max_word",
"text": ["我是中国人!"]
}
通过上面效果图,我们大概会了解到ik分词器不会跟ElasticSearch标准分词器一样只会把每个汉字拆分为单独一个词项,而是会根据分词类型(ik_smart,ik_max_word)把汉字拆分为不同词项,而且ik_smart拆分颗粒度比较粗糙,ik_max_word拆分颗粒度比较细致。
5.ik分词扩展词典
通过官方文档,我们知道ik分词器还支持扩展词典。我们先在elasticsearch/elasticsearch-7.8.0/plugins/ik/config目录下新建一个custom文件夹,在custom文件夹中再新建一个UTF-8编码的.txt文件,命名为mydic.dic(具体操作命令我就不详说了)内容如下图所示:
然后在elasticsearch/elasticsearch-7.8.0/plugins/ik/config目录下IKAnalyzer.cfg.xml 配置文件中修改如下配置(只修改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">custom/mydict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!--<entry key="remote_ext_dict">location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
然后重启elasticsearch,再通过kibana的dev_tools工具来看看ik分词器扩展效果:
POST _analyze
{
"analyzer":"ik_max_word",
"text": ["我是中国人!"]
}
6.ik热词更新
根据官方介绍,目前IK分词器是支持热词更新的,可以将需自动更新的热词放在一个UTF-8编码的.txt文件里,放在nginx或其他简易http server下,当.txt文件修改时,http server会在客户端请求该文件时自动返回相应的Last-Modified和ETag(该http请求需要返回两个头部header标识,一个是Last-Modified,一个是ETag,这两者都是字符串类型,只要有一个发生变化,IK分词器就会去抓取新的分词进而更新词库)。可以另外做一个工具来从业务系统提取相关词汇,并更新这个热词.txt文件。
下面演示我使用iis作为http server服务器,新建一个名称叫hotword站点,站点下有一个hotword.txt文件,应用池托管为v 4.0集成模式。
同时配置下如下两个选项:
hotword.txt内容如下:
这里要注意一点细节,因为http请求返回的内容格式是一行一个分词,所以hotword.txt词项要用换行符用 \n换行。
然后再通过在elasticsearch/elasticsearch-7.8.0/plugins/ik/config目录下IKAnalyzer.cfg.xml 配置文件中修改如下配置:
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://192.168.18.4:8082/hotword.txt</entry>
其中http://192.168.18.4:8082/hotword.txt是如上我本地部署热词站点。然后重启elasticsearch,在/elasticsearch/elasticsearch-7.8.0/logs/elasticsearch.log中可以看到加载的热词列表,如下所示:
通过kibana的dev_tools工具来看看ik分词器效果:
POST _analyze
{
"analyzer":"ik_max_word",
"text": ["我是中国人!"]
}