iMisty的技术栈

iMisty的技术栈

ElasticSearch建立IK中文分词器

2021-01-09

安装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,该请求只需满足以下两点即可完成分词热更新。

  1. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。

  2. 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。