ElasticSearch之IK分词器的安装与使用
前言
ElasticSearch中默认使用标准分词器进行分词,这种方式不适用于中文语法,所以对中文查询不友好。IK分词器是一款适用于中文语法,对中文分词、查询友好支持的一款分词器,下面我们来介绍一下IK分词器的安装与使用
安装
IK分词器不是ElasticSearch官方提供的,而是中国的以为大牛贡献的,而且开源到了github上: elasticsearch-analysis-ik
首先我们先下载与我们ElasticSearch版本对应的ik:elasticsearch-analysis-ik-6.8.0.zip
在正式安装ik分词器之前我们需要首先停止ElasticSearch
离线安装
-
首先上传我们下载的ik分词器的压缩包到ElasticSearch的plugins目录下
-
创建目录ik-analysis,移动ik至该目录下并解压
-
重新启动ElasticSearch
我们可以看到ElasticSearch启动是确实加载了ik分词器,并且顺利启动了。
配置完分词器启动ElasticSearch如果失败,就先去ElasticSearch目录下删除**data(历史数据)**目录,然后重新启动即可
在线安装
-
由于刚才我们演示了离线安装,首先我们要先停止ElasticSearch,删除离线安装的ik
-
删除ik分词器后,我们在ElasticSearch根目录下执行下面的安装命令
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
-
安装完成后我们可以看到plugins目录下生成了ik分词器的目录
-
安装成功后我们重新启动ElasticSearch
这次启动报错了,按照我们上面说的如果安装完ik分词器ElasticSearch报错就将ElasticSearch下的data目录删除,然后重新启动
成功启动,而且没有报错。因为我们删除了ElasticSearch的data目录,所以我们的kibana要重新启动,启动成功后我们再次进入kibana就可以了
特别注意
ElasticSearch在线安装IK和离线安装IK分词器两种方式生成的IK的配置文件坐在目录不一样
在线安装:在ES安装目录中config目录下的analysis-ik/IKAnalyzer.cfg.xml
离线安装:在ES安装目录中/plugins/analysis-ik/config/IKAnalyzer.cfg.xml
ik分词器测试
IK分词器提供了两种mapping类型用来做文档的分词分别是 ik_max_word
和ik_smart
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
进入到kibana输入一下命令测试ik分词器是否正常工作
GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_smart"
}
GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_max_word"
}
如果出现以上结果,那么恭喜你的ik分词器已经集成成功了。
扩展(停用)词(典)
测试数据
1. 创建索引、映射与类型
PUT /christy
{
"mappings": {
"user":{
"properties":{
"name":{
"type":"text",
# 索引分词器
"analyzer": "ik_max_word",
# 检索分词器,默认情况下与索引分词器保持一致,可不配置
"search_analyzer": "ik_max_word"
},
"age":{
"type":"integer"
},
"bir":{
"type":"date"
},
"introduce":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"address":{
"type":"keyword"
}
}
}
}
}
2.批量插入测试数据
PUT /christy/user/_bulk
{"index":{}}
{"name":"Christy","age":20,"bir":"2001-01-01","introduce":"不要求很帅,像我这样就可以了","address":"京师"}
{"index":{}}
{"name":"Tide","age":23,"bir":"1998-09-08","introduce":"魔镜魔镜谁是世界上最美的女人","address":"开封"}
{"index":{}}
{"name":"hardy","age":5,"bir":"2016-02-12","introduce":"调皮捣蛋我最行","address":"杭州"}
{"index":{}}
{"name":"Tom","age":18,"bir":"2003-12-12","introduce":"Jerry是我最好的朋友","address":"纽约"}
{"index":{}}
{"name":"Jerry","age":6,"bir":"2015-10-10","introduce":"没有Tom的日子我真的好难过","address":"华盛顿"}
{"index":{}}
{"name":"布什","age":3,"bir":"2018-11-10","introduce":"我不是美国的那个总统,我只是一条普拉多,没有骂人的意思","address":"华盛顿"}
{"index":{}}
{"name":"ElasticSearch","age":15,"bir":"2006-06-19","introduce":"ElasticSearch是最牛逼的搜索引擎","address":"杭州"}
概念
IK支持自定义扩展词典
和停用词典
,所谓**扩展词典
就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。停用词典
**就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。
可以修改IK分词器中
config
目录中IKAnalyzer.cfg.xml
这个文件来定义扩展词典和停用词典但是必须要注意的两点
1、词典的编码必须为UTF-8,否则无法生效
2、要注意在线安装和离线安装生成的IK配置文件位置不一样
我们最后采用的是在线安装的方式安装的ik,所以我们的ik生成的配置文件路径在ES安装目录中config目录下的analysis-ik/IKAnalyzer.cfg.xml
配置词典
1.修改配置文件
首先我们切换到ik的配置文件目录,通过命令vim IKAnalyzer.cfg.xml
来指定自己配置的词典
<?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">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopwords.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
配置文件修改完毕后保存退出
2.新建词典
通过命令touch ext_dict.dic
和touch ext_stopwords.dic
来创建我们的扩展词典和停用词典
3.自定义内容
可以看到我们通过vim ext_dict.dic
和vim ext_stopwords.dic
分别向扩展词典里面加了蓝瘦
和香菇
,在停用词典里面加入了碰瓷
4.重新启动ES
重新启动ElasticSearch的时候我们看到重新加载了IK的配置文件和我们自定义的扩展词典
5.测试
重新启动Kibana,添加以下测试数据
PUT /christy/user/_bulk
{"index":{}}
{"name":"干饭人","age":20,"bir":"2001-01-01","introduce":"晚上吃了三碗米饭,蓝瘦香菇","address":"京师大食堂"}
{"index":{}}
{"name":"郝建","age":23,"bir":"1998-09-08","introduce":"今天碰到一个碰瓷的老太太,好开森","address":"人民中路"}
{"index":{}}
根据我们配置的扩展词蓝瘦
和香菇
是可以搜索到我们想要查询的记录,而碰瓷
被我们加入到了停用词典中,所以无法搜索出该记录。但是通过查询所有该条数据确实存在的。
对于扩展词和停用词有以下两点必须清楚:
1.就是该扩展词和停用词只对后续插入记录时建立索引有作用,对在此之前的记录不起作用
2.在配置词典的时候一行只能配置一个词,ES默认会将这一行作为一个扩展(停用)词
远程词典
我们还记的上面配置词典是修改的IK的配置文件中这么两行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
……
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
远程词典(又称远程词库)主要解决动态添加扩展(停用)词,不用认为的去手动添加。比如优快云上的热搜,如果要我们实现类似功能的话我们可以将每日搜索量排名前十的词存入到redis,然后用定时任务将其写入到一个文本文件中最后通过远程扩展词典同步到ES。
上面只是个举例,下面我们通过springboot新建一个记录扩展词的ext.txt文本文件(远程扩展停止词典类似,不做演示了),并通过web方式可以进行访问该文件,然后将该链接配置到上面的远程扩展词典remote_ext_dict
1.新建项目
这个没有什么好说的啊,新建一个空的项目,按照下图的配置设置就行了
2.启动项目
在浏览器中输入ext.txt的访问地址http://192.168.2.192:8989/es/ext.txt
,能正常访问即可
3.配置远程扩展词典
我们先停止ElasticSearch,执行命令vim IKAnalyzer.cfg.xml
,修改以下内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
……
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://192.168.2.192:8989/es/ext.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
4.重启ES
重启ES后,我们可以看到远程扩展词典里面的词已经被加载
5.测试
然我们重新启动kibana,添加下面的数据
PUT /christy/user/_bulk
{"index":{}}
{"name":"柯南","age":10,"bir":"2011-01-01","introduce":"臭小子,你耗子尾汁吧","address":"东京"}
然后能行查询
GET /christy/user/_search
{
"query": {
"term": {
"introduce": {
"value": "耗子尾汁"
}
}
}
}
再比如我们在ext.txt中又加了一个网络热词内牛满面
,然后重新启动项目,ES则会自动加载远程词库(当然了这个需要点时间,不是立刻|及时加载的那种),如下图
这个时候我们再去下面的命令
ES确实将远程扩展词典里新加的内牛满面
当做一个分词了
ES集成IK分词器的内容就是上面这些了,其实内容也是挺多的,今天时间太晚了,明天继续,干饭人come on!!! ヾ(◍°∇°◍)ノ゙