elasticsearch 默认并不支持中文分词,默认将每个中文字切分为一个词,这明显不符合我们的业务要求。这里就需要用到ik分词插件。
本文主要囊括了以下几部分,ik插件安装、ik用法介绍、自定义词典使用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.1ADD elasticsearch-analysis-ik-7.1.1 /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.1.1
elasticsearch.yml
cluster.name: docker-clusternode.name: masternode.master: truenode.data: truenetwork.host: 0.0.0.0network.publish_host: 192.168.31.45cluster.initial_master_nodes: - masterhttp.cors.enabled: truehttp.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:9300volumes: 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即可
IK Analyzer 扩展配置 mydict.dic
远程扩展词典【生产环境下更方便】
- nginx部署一个mydict.dic的静态文件即可
ik每分钟获取一次,优势在于无需重启elasticsearch
IK Analyzer 扩展配置 http://192.168.1.1/static/txt/mydict.dic