默认ES中采用标准分词器进行分词,这种方式并不适用于中文网站,因此需要修改ES对中文友好分词,从而达到更佳的搜索的效果
参考官网:
https://github.com/medcl/elasticsearch-analysis-ik
IK 安装
在线安装IK
在线安装IK (v5.5.1版本后开始支持在线安装 )
1、删除ES原始数据
因为之前可能使用的标准分词器,如果存在数据,现在又使用IK分词器会出现冲突
进入es安装目录中将data目录数据删除
rm -rf data
2、安装IK
在es安装的bin目录中执行如下命令
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
3、查看IK
安装完成后会在plugins目录下,生成IK
[root@linux elasticsearch-6.8.0]$ ls plugins/
analysis-ik
4、重启es生效
进入bin目录下
./elasticsearch
5、测试
GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_smart"
}
# 结果
{
"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
}
]
}
也可使用下面的测试数据进行测试
6、在线安装IK的配置文件
加载配置文件的位置:
在es安装目录中config目录analysis-ik/IKAnalyzer.cfg.xml
NOTE: 要求版本严格与当前使用版本一致,如需使用其他版本替换 6.8.0
为使用的版本号
本地安装IK
1、下载IK安装包
https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.8.2
2、安装unzip
由于安装包是zip格式的,所以需要unzip方式解压
yum install -y unzip
3、创建IK目录
本地方式不像在线安装方式会自己生成一个目录,所以我们需要自己创建一个目录,把ik解压在里面
这里我们就在plugins下新建目录
mkdir IK
4、移动到es安装目录的plugins目录中
mv elasticsearch-analysis-ik-6.8.0.zip elasticsearch-6.8.0/plugins/IK
5.解压IK
unzip elasticsearch-analysis-ik-6.8.0.zip
6、重启ES
进入bin目录下
./elasticsearch
7、本地安装ik配置目录为
加载配置文件的位置:
es安装目录中/plugins/analysis-ik/config/IKAnalyzer.cfg.xml
8、测试
IK分词类型
IK分词器提供了两种mapping类型用来做文档的分词分别是 ik_max_word 和 ik_smart
ik_max_word 和 ik_smart 什么区别?
- ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
- ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”
测试数据
# 删除原有的ems索引数据
DELETE /ems
# 新建索引/类型/约束
# 同时针对属性增加了使用IK分词器
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": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"fields": {
"*":{}
}
}
}
配置扩展词
是什么
IK支持自定义 扩展词典 和 停用词典
扩展词典: 就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。
停用词典: 就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。
配置本地词典
如何扩展
这里采用的本地安装:可以修改IK分词器中config目录中 IKAnalyzer.cfg.xml 这个文件
1、建分词文件
进入安装的IK分词文件的config目录下,新建 ext.dic
NOTE:
- 词典的编码必须为UTF-8,否则无法生效
- 多个词要分行放置
填入你想要扩展的词:
杠精
2、改配置文件
一定要注意ES你采用的是哪种安装方式
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.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
</properties>
3、重启ES
删除之前的数据进行重启
./elasticsearch
4、测试
GET /_analyze
{
"text":"碰瓷",
"analyzer": "ik_max_word"
}
# 结果
{
"tokens" : [
{
"token" : "碰瓷",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
}
]
}
配置的扩展器只针对配置过后索引的文档有效,之前已经索引的文档想要使用改扩展词,需要重新索引
如何停用
操作和扩展一样,只是文件名在IKAnalyzer.cfg.xml中填入的位置不一样
配置远程词典
本地词典写入的词一旦写入,后面再想去填入或者停用,比较麻烦
比如,我这个博客网站我想根据用户输入的词的搜索达到多少后将其认定为热词添加到词典中,并且一段时间后进行一定的更新
EMS这个应用就相当于我们的博客,在这个下面我们创建了一个文件ext.txt,专门用于存放热词,而这个热词具体怎么来,我们可以结合redis,当用户搜索词的次数达到多少,我们通过IO写入这个文件中,然后ES通过监听url这个地址上的数据发生了变化,就进行相应的更新
1、建SpringBoot应用
2、改项目访问路径
想要访问到静态资源,需要修改一下配置
3、测试访问项目
之前我们一直使用localhost访问本地,但是后面需要在Linux端访问,所以需要用windows的ip地址:
使用:ipconfig查看
http://192.168.77.1:8888/ext.txt
4、改ES配置文件
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">ex.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://192.168.77.1:8888/ext.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://192.168.77.1:8888/stop.txt</entry>
</properties>
5、重启ES
./elasticsearch
6、测试
GET /_analyze
{
"text":"打工人",
"analyzer": "ik_max_word"
}
# 结果
{
"tokens" : [
{
"token" : "打工人",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "打工",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "工人",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 2
}
]
}
发现"打工人"这个词作为分词关键词了
下面我们试试停用分词,我们将"打工"这个词停用
在stop.txt中写入:
打工
重启springboot项目
我们看一下ES界面的变化,它会去拉取远程需要加入或者停用的词到字典中
kibana 中测试:
GET /_analyze
{
"text":"打工人",
"analyzer": "ik_max_word"
}
# 结果
{
"tokens" : [
{
"token" : "打工人",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "工人",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 1
}
]
}
发现就没有将"打工"这个词作为分词关键字了