ES中文分词该怎么玩?它的分词原理?ik分词器如何使用?
大家好,我是D哥
Java面试那些事儿
回复关键字Java,领取大厂最新面试题和简历模板。同时还可以与30w+程序员一起学习技术干货,包括JVM、Spring Cloud、Intellij IDEA、Dubbo、Zookeeper、Redis、架构设计、微服务、Git等。
Official Account
# ES 中的分词的原理
1、ES 的分词器概念
2、标准分词器原理
3、英文和标点符号分词示例
POST _analyze
{
"analyzer": "standard",
"text": "Do you know why I want to study ELK? 2 3 33..."
}
do, you, know, why, i, want, to, study, elk, 2,3,33
4、中文分词示例
POST _analyze
{
"analyzer": "standard",
"text": "悟空聊架构"
}
# 安装 ik 分词器
1、ik 分词器地址
https://github.com/medcl/elasticsearch-analysis-ik/releases
http://192.168.56.10:9200/
{
"name" : "8448ec5f3312",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "xC72O3nKSjWavYZ-EPt9Gw",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
2、安装 ik 分词器的方式
1、方式一:容器内安装 ik 分词器
-
进入 es 容器内部 plugins 目录
docker exec -it <容器 id> /bin/bash
-
获取 ik 分词器压缩包
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
-
解压缩 ik 压缩包
unzip 压缩包
-
删除下载的压缩包
rm -rf *.zip
2、方式二:映射文件安装 ik 分词器
cd /mydata/elasticsearch/plugins
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
-
解压缩 ik 压缩包
unzip 压缩包
-
删除下载的压缩包
rm -rf *.zip
3、方式三:Xftp 上传压缩包到映射目录
# 解压 ik 分词器到容器中
-
如果没有安装 unzip 解压工具,则安装 unzip 解压工具。
apt install unzip
-
解压 ik 分词器到当前目录的 ik 文件夹下。
unzip ELK-IKv7.4.2.zip -d ./ik
-
修改文件夹权限为可读可写。
chmod -R 777 ik/
-
删除 ik 分词器压缩包
rm ELK-IKv7.4.2.zip
# 检查 ik 分词器安装
-
进入到容器中
docker exec -it <容器 id> /bin/bash
-
查看 Elasticsearch 的插件
elasticsearch-plugin list
ik
exit
docker restart elasticsearch
# 使用 ik 中文分词器
-
智能分词模式 ( ik_smart )
-
最大组合分词模式 ( ik_max_word )
POST _analyze
{
"analyzer": "ik_smart",
"text": "一颗小星星"
}
POST _analyze
{
"analyzer": "ik_max_word",
"text": "一颗小星星"
}
# 自定义分词词库
1、自定义词库的方案
-
方案
新建一个词库文件,然后在 ik 分词器的配置文件中指定分词词库文件的路径。可以指定本地路径,也可以指定远程服务器文件路径。这里我们使用远程服务器文件的方案,因为这种方案可以支持热更新 ( 更新服务器文件,ik 分词词库也会重新加载 ) 。
-
修改配置文件
/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml。
/mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml
vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>
2、搭建 nginx 环境
-
通过 docker 容器安装 nginx 环境。
docker run -p 80:80 --name nginx -d nginx:1.10
-
拷贝 nginx 容器的配置文件到 mydata 目录的 conf 文件夹
cd /mydata
docker container cp nginx:/etc/nginx ./conf
-
mydata 目录 里面创建 nginx 目录
mkdir nginx
-
移动 conf 文件夹到 nginx 映射文件夹
mv conf nginx/
-
终止并删除原 nginx 容器
docker stop nginx
docker rm <容器 id>
-
启动新的容器
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
-
访问 nginx 服务
192.168.56.10
报 403 Forbidden, nginx/1.10.3 则表示 nginx 服务正常启动。
403 异常的原因是 nginx 服务下没有文件。
-
nginx 目录新建一个 html 文件
cd /mydata/nginx/html
vim index.html
hello passjava
-
再次访问 nginx 服务
-
创建 ik 分词词库文件
cd /mydata/nginx/html
mkdir ik
cd ik
vim ik.txt
-
访问词库文件
http://192.168.56.10/ik/ik.txt
浏览器会输出一串乱码,可以先忽略乱码问题。 说明词库文件可以访问到。
-
修改 ik 分词器配置
cd /mydata/elasticsearch/plugins/ik/config
vim IKAnalyzer.cfg.xml
-
重启 elasticsearch 容器并设置每次重启机器后都启动 elasticsearch 容器。
docker restart elasticsearch
docker update elasticsearch --restart=always
-
再次查询分词结果