Elasticsearch iK分词器
elasticsearch插件
elasticsearch插件默认安装在/usr/share/elasticsearch/plugins中
1 | [root@elastic-01 ~]# ll /usr/share/elasticsearch/plugins/ |
安装插件时可以使用自带的命令进行安装
1 | [root@elastic-01 ~]# /usr/share/elasticsearch/bin/elasticsearch-plugin -h |
iK分词器
iK分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
1 | [root@elastic-01 ~]# /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip |
测试iK分词器功能
以下操作均在kibana中dev tools中完成
直接调用分词器测试分词后结果
分词器两种模式
- ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
- ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询
1 | POST _analyze |
获取输出的结果
1 | { |
以上方式属即时调用,不会留存数据,下面则是在创建索引阶段设置mapping来对指定字段数据进行分词
创建索引
1 | PUT testindex |
创建mapping映射,在mapping中对字段content使用分词器
1 | POST testindex/_mapping |
创建模拟数据
1 | POST testindex/_create/1 |
highlight查询测试
1 | POST testindex/_search |
查询结果输出
1 | { |
自定义分词字典
如果想要按照自己分词规则去分词,可以创建自己的字典,我们查看下ik分词器的配置字典
1 | # 注意安装完iK分词器后,它的配置文件会在/etc/elasticsearch/analysis-ik/目录中,而不是 |
配置自己的分词字典
创建一个测试字典
1 | [root@elastic-01 elasticsearch]# cat analysis-ik/mydic.dic |
配置iK分词器配置加载自建字典
1 | [root@elastic-01 elasticsearch]# cat /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml |
重启服务后测试
测试语句
1 | POST _analyze |
以下是未使用自建分词器时的结果
1 | { |
使用自建分词字典后的结果
1 | { |
iK分词器动态字典
之前介绍的静态字典,每次更新字典就需要重新启动es服务,不适用。此处讲下动态更新字典:
通过上文在 IK 配置文件中提到的如下配置
1 | <!--用户可以在这里配置远程扩展字典 --> |
其中 location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。
- 该 http 请求需要返回两个头部(header),一个是
Last-Modified,一个是ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。 - 该 http 请求返回的内容格式是一行一个分词,换行符用
\n即可。
满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。
可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。
以上来自官方解释,此处我们创建一个nginx静态站点来提供字典即可
1 | yum install nginx -y |
将自定义字典放入/usr/share/nginx/www即可
1 | [root@elastic-01 nginx]# cp /etc/elasticsearch/analysis-ik/mydic.dic /usr/share/nginx/www |
调整ik分词器配置并重启配置
1 | [root@elastic-01 nginx]# cat >/etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml<<-'EOF' |
测试下效果
1 | POST _analyze |
分词结果为
1 | { |
我们对字典新增一个词 奥里给
1 | [root@elastic-01 nginx]# cat /usr/share/nginx/www/mydic.dic |
此时分词结果为
1 | { |
热更新字典可以在日志体现
1 | [2022-12-12T17:05:00,169][INFO ][o.w.a.d.Monitor ] [node-1] start to reload ik dict. |
