ES中文分词该怎么玩?它的分词原理?ik分词器如何使用?
Java面试那些事儿 文章源自JAVA秀-https://www.javaxiu.com/8666.html
以下文章来源于悟空聊架构,作者悟空哥文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html 文章源自JAVA秀-https://www.javaxiu.com/8666.html 悟空聊架构文章源自JAVA秀-https://www.javaxiu.com/8666.html 用故事讲解分布式、架构。 《 JVM 性能调优实战》专栏作者, 《Spring Cloud 实战 PassJava》开源作者, 自主开发了 PMP 刷题小程序。文章源自JAVA秀-https://www.javaxiu.com/8666.html
大家好,我是D哥点击关注下方公众号,Java面试资料 都在这里
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
Elasticsearch(简称 ES)的搜索引擎内置了很多种分词器,但是对中文分词不友好,比如搜索悟空哥,是搜不到的,所以我们需要借助第三方中文分词工具包。文章源自JAVA秀-https://www.javaxiu.com/8666.html
悟空哥专门研究了下 ik 中文分词工具包该怎么玩,希望对大家有所帮助。文章源自JAVA秀-https://www.javaxiu.com/8666.html
本文主要内容如下:文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
主要内容文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
# ES 中的分词的原理
文章源自JAVA秀-https://www.javaxiu.com/8666.html
1、ES 的分词器概念
文章源自JAVA秀-https://www.javaxiu.com/8666.html
ES 的一个分词器 ( tokenizer ) 接收一个字符流,将其分割为独立的词元 ( tokens ) ,然后输出词元流。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
ES 提供了很多内置的分词器,可以用来构建自定义分词器 ( custom ananlyzers )文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
2、标准分词器原理
文章源自JAVA秀-https://www.javaxiu.com/8666.html
比如 stadard tokenizer 标准分词器,遇到空格进行分词。该分词器还负责记录各个词条 ( term ) 的顺序或 position 位置 ( 用于 phrase 短语和 word proximity 词近邻查询 ) 。每个单词的字符偏移量 ( 用于高亮显示搜索的内容 ) 。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
3、英文和标点符号分词示例
文章源自JAVA秀-https://www.javaxiu.com/8666.html
查询示例如下:文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlPOST _analyze
{
"analyzer": "standard",
"text": "Do you know why I want to study ELK? 2 3 33..."
}
查询结果:文章源自JAVA秀-https://www.javaxiu.com/8666.html
do, you, know, why, i, want, to, study, elk, 2,3,33
文章源自JAVA秀-https://www.javaxiu.com/8666.html从查询结果可以看到:文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
(1)标点符号没有分词。文章源自JAVA秀-https://www.javaxiu.com/8666.html
(2)数字会进行分词。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
英文句子分词文章源自JAVA秀-https://www.javaxiu.com/8666.html
4、中文分词示例
文章源自JAVA秀-https://www.javaxiu.com/8666.html
但是这种分词器对中文的分词支持不友好,会将词语分词为单独的汉字。比如下面的示例会将悟空聊架构分词为 悟,空,聊,架,构,期望分词为悟空,聊,架构。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlPOST _analyze
{
"analyzer": "standard",
"text": "悟空聊架构"
}
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
中文分词悟空聊架构文章源自JAVA秀-https://www.javaxiu.com/8666.html
我们可以安装 ik 分词器来更加友好的支持中文分词。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
# 安装 ik 分词器
文章源自JAVA秀-https://www.javaxiu.com/8666.html
1、ik 分词器地址
文章源自JAVA秀-https://www.javaxiu.com/8666.html
ik 分词器地址:文章源自JAVA秀-https://www.javaxiu.com/8666.html
https://github.com/medcl/elasticsearch-analysis-ik/releases
文章源自JAVA秀-https://www.javaxiu.com/8666.html先检查 ES 版本,我安装的版本是 7.4.2,所以我们安装 ik 分词器的版本也选择 7.4.2文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlhttp://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"
}
选择 ik 分词器文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
2、安装 ik 分词器的方式
文章源自JAVA秀-https://www.javaxiu.com/8666.html
1、方式一:容器内安装 ik 分词器
文章源自JAVA秀-https://www.javaxiu.com/8666.html
进入 es 容器内部 plugins 目录文章源自JAVA秀-https://www.javaxiu.com/8666.html
docker exec -it <容器 id> /bin/bash
文章源自JAVA秀-https://www.javaxiu.com/8666.html获取 ik 分词器压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
文章源自JAVA秀-https://www.javaxiu.com/8666.html解压缩 ik 压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
unzip 压缩包
文章源自JAVA秀-https://www.javaxiu.com/8666.html删除下载的压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
rm -rf *.zip
文章源自JAVA秀-https://www.javaxiu.com/8666.html2、方式二:映射文件安装 ik 分词器
文章源自JAVA秀-https://www.javaxiu.com/8666.html
进入到映射文件夹文章源自JAVA秀-https://www.javaxiu.com/8666.html
cd /mydata/elasticsearch/plugins
文章源自JAVA秀-https://www.javaxiu.com/8666.html下载安装包文章源自JAVA秀-https://www.javaxiu.com/8666.html
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
文章源自JAVA秀-https://www.javaxiu.com/8666.html解压缩 ik 压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
unzip 压缩包
文章源自JAVA秀-https://www.javaxiu.com/8666.html删除下载的压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
rm -rf *.zip
文章源自JAVA秀-https://www.javaxiu.com/8666.html3、方式三:Xftp 上传压缩包到映射目录
文章源自JAVA秀-https://www.javaxiu.com/8666.html
先用 XShell 工具连接虚拟机 ,然后用 Xftp 将下载好的安装包复制到虚拟机。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
Xftp 上传压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
# 解压 ik 分词器到容器中
文章源自JAVA秀-https://www.javaxiu.com/8666.html
如果没有安装 unzip 解压工具,则安装 unzip 解压工具。文章源自JAVA秀-https://www.javaxiu.com/8666.html
apt install unzip
解压 ik 分词器到当前目录的 ik 文件夹下。文章源自JAVA秀-https://www.javaxiu.com/8666.html
命令格式:unzip <ik 分词器压缩包>文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
实例:文章源自JAVA秀-https://www.javaxiu.com/8666.html
unzip ELK-IKv7.4.2.zip -d ./ik
文章源自JAVA秀-https://www.javaxiu.com/8666.html文章源自JAVA秀-https://www.javaxiu.com/8666.html
解压 ik 分词器文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
修改文件夹权限为可读可写。文章源自JAVA秀-https://www.javaxiu.com/8666.html
chmod -R 777 ik/
文章源自JAVA秀-https://www.javaxiu.com/8666.html删除 ik 分词器压缩包文章源自JAVA秀-https://www.javaxiu.com/8666.html
rmELK-IKv7.4.2.zip
文章源自JAVA秀-https://www.javaxiu.com/8666.html# 检查 ik 分词器安装
文章源自JAVA秀-https://www.javaxiu.com/8666.html
进入到容器中文章源自JAVA秀-https://www.javaxiu.com/8666.html
docker exec -it <容器 id> /bin/bash
文章源自JAVA秀-https://www.javaxiu.com/8666.html查看 Elasticsearch 的插件文章源自JAVA秀-https://www.javaxiu.com/8666.html
elasticsearch-plugin list
文章源自JAVA秀-https://www.javaxiu.com/8666.html结果如下,说明 ik 分词器安装好了。是不是很简单。文章源自JAVA秀-https://www.javaxiu.com/8666.html
ik
文章源自JAVA秀-https://www.javaxiu.com/8666.html文章源自JAVA秀-https://www.javaxiu.com/8666.html
ik 分词器插件文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
然后退出 Elasticsearch 容器,并重启 Elasticsearch 容器文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlexit
docker restart elasticsearch
# 使用 ik 中文分词器
文章源自JAVA秀-https://www.javaxiu.com/8666.html
ik 分词器有两种模式文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
智能分词模式 ( ik_smart )文章源自JAVA秀-https://www.javaxiu.com/8666.html
最大组合分词模式 ( ik_max_word )文章源自JAVA秀-https://www.javaxiu.com/8666.html
我们先看下智能分词模式的效果。比如对于一颗小星星进行中文分词,得到的两个词语:一颗、小星星文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
我们在 Dev Tools Console 输入如下查询文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlPOST _analyze
{
"analyzer": "ik_smart",
"text": "一颗小星星"
}
得到如下结果,被分词为一颗和小星星。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
一颗小星星分词结果文章源自JAVA秀-https://www.javaxiu.com/8666.html
再来看下 最大组合分词模式。输入如下查询语句。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlPOST _analyze
{
"analyzer": "ik_max_word",
"text": "一颗小星星"
}
一颗小星星被分成了 6 个词语:一颗、一、颗、小星星、小星、星星。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
一颗小星星分词结果文章源自JAVA秀-https://www.javaxiu.com/8666.html
我们再来看下另外一个中文分词。比如搜索悟空哥聊架构,期望结果:悟空哥、聊、架构三个词语。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
实际结果:悟、空哥、聊、架构四个词语。ik 分词器将悟空哥分词了,认为空哥是一个词语。所以需要让 ik 分词器知道悟空哥是一个词语,不需要拆分。那怎么办做呢?文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
悟空哥聊架构分词文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
# 自定义分词词库
文章源自JAVA秀-https://www.javaxiu.com/8666.html
1、自定义词库的方案
文章源自JAVA秀-https://www.javaxiu.com/8666.html
方案文章源自JAVA秀-https://www.javaxiu.com/8666.html
新建一个词库文件,然后在 ik 分词器的配置文件中指定分词词库文件的路径。可以指定本地路径,也可以指定远程服务器文件路径。这里我们使用远程服务器文件的方案,因为这种方案可以支持热更新 ( 更新服务器文件,ik 分词词库也会重新加载 ) 。文章源自JAVA秀-https://www.javaxiu.com/8666.html
修改配置文件文章源自JAVA秀-https://www.javaxiu.com/8666.html
ik 分词器的配置文件在容器中的路径:文章源自JAVA秀-https://www.javaxiu.com/8666.html
/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml。
文章源自JAVA秀-https://www.javaxiu.com/8666.html修改这个文件可以通过修改映射文件,文件路径:文章源自JAVA秀-https://www.javaxiu.com/8666.html
/mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml
文章源自JAVA秀-https://www.javaxiu.com/8666.html编辑配置文件:文章源自JAVA秀-https://www.javaxiu.com/8666.html
vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml
文章源自JAVA秀-https://www.javaxiu.com/8666.html配置文件内容如下所示:文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entrykey="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entrykey="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<entrykey="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entrykey="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>
修改配置 remote_ext_dict 的属性值,指定一个 远程网站文件的路径,比如 文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
http://www.xxx.com/ikwords.text。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
这里我们可以自己搭建一套 nginx 环境,然后把 ikwords.text 放到 nginx 根目录。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
2、搭建 nginx 环境
文章源自JAVA秀-https://www.javaxiu.com/8666.html
方案:首先获取 nginx 镜像,然后启动一个 nginx 容器,然后将 nginx 的配置文件拷贝到根目录,再删除原 nginx 容器,再用映射文件夹的方式来重新启动 nginx 容器。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
通过 docker 容器安装 nginx 环境。文章源自JAVA秀-https://www.javaxiu.com/8666.html
dockerrun-p 80:80--namenginx-dnginx:1.10
文章源自JAVA秀-https://www.javaxiu.com/8666.html拷贝 nginx 容器的配置文件到 mydata 目录的 conf 文件夹文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlcd /mydata
docker container cp nginx:/etc/nginx ./conf
mydata 目录 里面创建 nginx 目录文章源自JAVA秀-https://www.javaxiu.com/8666.html
mkdir nginx
文章源自JAVA秀-https://www.javaxiu.com/8666.html移动 conf 文件夹到 nginx 映射文件夹文章源自JAVA秀-https://www.javaxiu.com/8666.html
mv conf nginx/
文章源自JAVA秀-https://www.javaxiu.com/8666.html终止并删除原 nginx 容器文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmldockerstop nginx
dockerrm <容器 id>
启动新的容器文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmldockerrun -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 服务文章源自JAVA秀-https://www.javaxiu.com/8666.html
192.168.56.10
文章源自JAVA秀-https://www.javaxiu.com/8666.html报 403 Forbidden, nginx/1.10.3 文章源自JAVA秀-https://www.javaxiu.com/8666.html
则表示 nginx 服务正常启动。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
403 异常的原因是 nginx 服务下没有文件。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
nginx 目录新建一个 html 文件文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlcd/mydata/nginx/html
vimindex.html
hellopassjava
再次访问 nginx 服务文章源自JAVA秀-https://www.javaxiu.com/8666.html
浏览器打印 hello passjava。说明访问 nginx 服务的页面没有问题。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
创建 ik 分词词库文件文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlcd/mydata/nginx/html
mkdirik
cdik
vimik.txt
填写悟空哥,并保存文件。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
访问词库文件文章源自JAVA秀-https://www.javaxiu.com/8666.html
http://192.168.56.10/ik/ik.txt
文章源自JAVA秀-https://www.javaxiu.com/8666.html浏览器会输出一串乱码,可以先忽略乱码问题。文章源自JAVA秀-https://www.javaxiu.com/8666.html
说明词库文件可以访问到。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
修改 ik 分词器配置文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmlcd/mydata/elasticsearch/plugins/ik/config
vimIKAnalyzer.cfg.xml
文章源自JAVA秀-https://www.javaxiu.com/8666.html
修改 ik 分词器配置文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
重启 elasticsearch 容器并设置每次重启机器后都启动 elasticsearch 容器。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.htmldockerrestart elasticsearch
dockerupdate elasticsearch --restart=always
再次查询分词结果文章源自JAVA秀-https://www.javaxiu.com/8666.html
可以看到悟空哥聊架构被拆分为悟空哥、聊、架构 三个词语,说明自定义词库中的悟空哥有作用。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
终于可以搜到 悟空哥 了~文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
热门推荐:文章源自JAVA秀-https://www.javaxiu.com/8666.html
腾讯,干掉 Redis 项目,正式开源、太牛逼啦!文章源自JAVA秀-https://www.javaxiu.com/8666.html
雷军被骗?花200万换logo迎来全民热搜,不亏!文章源自JAVA秀-https://www.javaxiu.com/8666.html
那些去了柬埔寨的高薪程序员,过得到底如何?网友:面向阎王编程。。。文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html
文章源自JAVA秀-https://www.javaxiu.com/8666.html

评论