ElasticSearch建立IK中文分词器
编辑安装IK中文分词器
IK分词器代码库https://github.com/medcl/elasticsearch-analysis-ik
下载地址(不是源代码) https://github.com/medcl/elasticsearch-analysis-ik/releases
- 直接安装在es安装目录的plugin目录
- 或者使用elasticsearch-plugin安装,参考代码库的文档即可
1. 下载中文插件(最好和es版本对应)
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.1/elasticsearch-analysis-ik-7.10.1.zip
2.上传并解压到es安装目录的plugin文件夹下
cd your-es-root/plugins/ && mkdir ik
# 解压目录到ik文件夹下
unzip elasticsearch-analysis-ik-7.10.1.zip
3. 重新启动elasticsearch实例
[esuser@service1 elasticsearch-7.10.1]$ jps
7361 Jps
3335 Elasticsearch
[esuser@service1 elasticsearch-7.10.1]$ kill -9 3335
[esuser@service1 elasticsearch-7.10.1]$ ./bin/elasticsearch -d
ik_max_word 和 ik_smart 什么区别?
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
使用中文分词器
安装分词器之后使用方法和使用内置分词器是一样的
POST /_analyze
{
"analyzer":"ik_max_word",
"text":"中华人民共和国"
}
自定义中文词库
因为一些网络用语和专业词汇不会进行分词,所以需要进行自定义词库,这样才会将这些自定义的词汇进行拆分;
配置文件位置 IKAnalyzer.cfg.xml can be located at /analysis-ik/config/IKAnalyzer.cfg.xml or /elasticsearch-analysis-ik-*/config/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">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>
1. 首先创建词库,在IKAnalyzer.cfg.xml同级目录下创建词库custom.dic
:
程序媛
程序猿
2. 然后引入词库
3. 重启ES实例
参考之前的方式
4. 测试
5. 注意事项
-
启动的时候关注日志是否引入了自定义扩展词库
-
还需要注意是否存在xml解析错误,因为实际操作过程中因为标签多删除了一个字符,导致自定义词库没有生效
- 非常重要的是:请确保你的扩展词典的文本格式为 UTF8 编码;否则也会导致自定义词库不生效
热更新 IK 分词使用方法
目前该插件支持热更新 IK 分词,通过上文在 IK 配置文件中提到的如下配置
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">location</entry>
其中 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 文件。
- 0
- 2
-
分享