elasticsearch ik分词
elasticsearch 默认并不支持中文分词,默认将每个中文字切分为一个词,这明显不符合我们的业务要求。这里就需要用到ik分词插件。
本文主要囊括了以下几部分,ik插件安装、ik用法介绍、自定义词典使用
ik插件安装
- 查找并下载对应elasticsearch版本的ik,解压
- 编写Dockerfile
- 运行测试 $docker-compose up -d
新增ik插件功能配置实际上非常简单,仅需将解压后的elasticsearch-analysis-ik文件放置到es/plugins路径下即可。本文使用dockerfile来实现
Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:7.1.1
ADD elasticsearch-analysis-ik-7.1.1 /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.1.1
ik用法介绍
- ik_max_word: 会将文本做最细粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌",会穷尽各种可能的组合;
- ik_smart: 会做最粗粒度的拆分,比如会将"中华人民共和国国歌"拆分为"中华人民共和国,国歌"。
创建articles索引,设置mappings
PUT /articles/
{
"settings":{
"number_of_shards":5,
"number_of_replicas":1
},
"mappings":{
"properties":{
"title":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"info":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
}
}
}
}
插入数据后,查看分词结果
GET /${index}/${type}/${id}/_termvectors?fields=${fields_name} # 查看分词结果
返回的结果
"价值": {
"term_freq": 1, # 词频
"tokens": [
{
"position": 14, # 位置
"start_offset": 22, # 启始位置
"end_offset": 24 # 结束位置
}
]
},
自定义词典使用
配置文件在es/plugins/ik/config目录下
IKAnalyzer.cfg.xml:用来配置自定义词库
main.dic:ik原生内置的中文词库,总共有27万多条,只要是这些单词,都会被分在一起
quantifier.dic:放了一些单位相关的词
suffix.dic:放了一些后缀
surname.dic:中国的姓氏
stopword.dic:英文停用词
# ik原生最重要i的两个配置文件
main.dic:包含了原生的中文词语,会按照这个里面的词语去分词
stopword.dic:包含了英文的停用词
一般像停用词,会在分词的时候,直接被干掉,不会建立在倒排索引中
本地文件扩展词典
- 在该目录下新建mydict.dic文件
- 修改IKAnalyzer.cfg.xml配置文件文件
- 重启elasticsearch即可
<?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">mydict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
远程扩展词典【生产环境下更方便】
- nginx部署一个mydict.dic的静态文件即可
ik每分钟获取一次,优势在于无需重启elasticsearch
<?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"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://192.168.1.1/static/txt/mydict.dic</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>