11. IK分词器
NOTE: 默认ES中采用标准分词器进行分词,这种方式并不适用于中文网站,因此需要修改ES对中文友好分词,从而达到更佳的搜索的效果。
11.1 在线安装IK
在线安装IK (v5.5.1版本后开始支持在线安装 )
# 0.必须将es服务中原始数据删除
- 以root用户进入es安装目录中将data目录数据删除
rm -rf data
# 1. 在es安装目录中执行如下命令
[es@linux elasticsearch-6.8.0]$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
[=================================================] 100%
-> Installed analysis-ik
[es@linux elasticsearch-6.8.0]$ ls plugins/
analysis-ik
[es@linux elasticsearch-6.8.0]$ cd plugins/analysis-ik/
[es@linux analysis-ik]$ ls
commons-codec-1.9.jar elasticsearch-analysis-ik-6.8.0.jar httpcore-4.4.4.jar
commons-logging-1.2.jar httpclient-4.5.2.jar plugin-descriptor.properties
# 2. 重启es生效
./elasticsearch
# 3.测试ik安装成功
GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_smart"
}
# 4.在线安装IK配置文件
- es安装目录中config目录analysis-ik/IKAnalyzer.cfg.xml
NOTE: 要求版本严格与当前使用版本一致,如需使用其他版本替换
6.2.4
为使用的版本号
11.2 本地安装IK
可以将对应的IK分词器下载到本地,然后再安装 NOTE: 本课程使用本地安装
# 1. 下载对应版本
- [es@linux ~]$ wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip
# 2. 解压
- [es@linux ~]$ unzip elasticsearch-analysis-ik-6.2.4.zip #先使用yum install -y unzip
# 3. 移动到es安装目录的plugins目录中
- [es@linux ~]$ ls elasticsearch-6.2.4/plugins/
[es@linux ~]$ mv elasticsearch elasticsearch-6.2.4/plugins/
[es@linux ~]$ ls elasticsearch-6.2.4/plugins/
elasticsearch
[es@linux ~]$ ls elasticsearch-6.2.4/plugins/elasticsearch/
commons-codec-1.9.jar config httpclient-4.5.2.jar plugin-descriptor.properties
commons-logging-1.2.jar elasticsearch-analysis-ik-6.2.4.jar httpcore-4.4.4.jar
# 4. 重启es生效
# 5. 本地安装ik配置目录为
- es安装目录中/plugins/analysis-ik/config/IKAnalyzer.cfg.xml
11.3 测试IK分词器
NOTE: IK分词器提供了两种mapping类型用来做文档的分词分别是
ik_max_word
和ik_smart
ik_max_word 和 ik_smart 什么区别?
ik_max_word: 会将文本做最细粒度的拆分
,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分
,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
测试数据
DELETE /ems
PUT /ems
{
"mappings":{
"emp":{
"properties":{
"name":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"age":{
"type":"integer"
},
"bir":{
"type":"date"
},
"content":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"address":{
"type":"keyword"
}
}
}
}
}
PUT /ems/emp/_bulk
{"index":{}}
{"name":"小黑","age":23,"bir":"2012-12-12","content":"为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
{"index":{}}
{"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式","address":"上海"}
{"index":{}}
{"name":"张小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来越完善","address":"无锡"}
{"index":{}}
{"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目标是致力于全方位的简化Java开发。 这势必引出更多的解释, Spring是如何简化Java开发的?","address":"南京"}
{"index":{}}
{"name":"梅超风","age":43,"bir":"2012-12-12","content":"Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API","address":"杭州"}
{"index":{}}
{"name":"张无忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口","address":"北京"}
GET /ems/emp/_search
{
"query":{
"term":{
"content":"框架"
}
},
"highlight": {
"pre_tags": [""],
"post_tags": [""],
"fields": {
"*":{}
}
}
}
11.4 配置扩展词
IK支持自定义
扩展词典
和停用词典
,所谓扩展词典
就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。停用词典
就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。如何定义扩展词典和停用词典可以修改IK分词器中
config
目录中analysis-ik
文件夹中的IKAnalyzer.cfg.xml
这个文件。NOTE:词典的编码必须为UTF-8,否则无法生效
1. 修改vim IKAnalyzer.cfg.xml
IK Analyzer 扩展配置
ext_dict.dic
ext_stopword.dic
2. 在ik分词器目录下config目录中analysis-ik文件夹创建ext_dict.dic文件 编码一定要为UTF-8才能生效(直接复制main.dic改名ext_dict.dic)
vim ext_dict.dic 加入扩展词即可
3. 在ik分词器目录下config目录中analysis-ik文件夹创建ext_stopword.dic文件
vim ext_stopword.dic 加入停用词即可
4.重启es生效
GET /ems/emp/_search
{
"query": {
"query_string": {
"query": "碰瓷",
"analyzer": "ik_max_word",
"fields": ["name","content"]
}
}
}
配置IK远程拓展词典和停用词典:
为什么要有远程拓展字典呢?
因为我们以后站内会产生一些新词,当我们redis里记录的这个新词的超过1万词,我们就将其更新到我们项目中的拓展文件,es回去读取我们的拓展文件。
将下面红框的地址改成项目中拓展字典文件比如我们springems项目中的拓展文件.txt