elasticsearch 默认并不支持中文分词,默认将每个中文字切分为一个词,这明显不符合我们的业务要求。这里就需要用到ik分词插件。
本文主要囊括了以下几部分,ik插件安装、ik用法介绍、自定义词典使用
ik插件安装
- 查找并下载对应elasticsearch版本的ik,解压
- 编写Dockerfile
- 运行测试 $docker-compose up -d
文件目录结构
|-- elasticsearch // 项目根目录
| |-- Dockerfile // Dockerfile文件
| |-- elasticsearch.yml // elasticsearch配置文件
| |-- docker-compose.yml // docker-compose配置文件
| |-- elasticsearch-analysis-ik-7.1.1 // ik解压文件夹
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
elasticsearch.yml
cluster.name: docker-cluster
node.name: master
node.master: true
node.data: true
network.host: 0.0.0.0
network.publish_host: 192.168.31.45
cluster.initial_master_nodes:
- master
http.cors.enabled: true
http.cors.allow-origin: "*"
docker-compose.yml
version: '3'
services:
es:
build: .
container_name: master
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- esdata:/usr/share/elasticsearch/data
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
ports:
- 9200:9200
- 9300:9300
volumes:
esdata:
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} # 查看分词结果
自定义词典使用
配置文件在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>