上篇文章介绍了如何基于 DOCKER 快速部署 ELASTICSEARCH 集群,接下来介绍如何在容器里集成IK分词器
什么是分词器?为什么要分词器?
Es默认的分词器,在中文的分词上并不友好,会将语句每个字进行分词作为索引,所以在使用Term关键字查询的时候多个汉字无法命中文档。这个时候就需要一个合理的分词规则,将一个完整的语句划分为多个比较复合表达逻辑的独立的词条。分词器包含三个部分:
- character filter:分词之前的预处理,过滤掉HTML标签、特殊符号转换(例如,将&符号转换成and、将|符号转换成or)等
- tokenizer:分词
- token filter:标准化
ElasticSeach内置分词器
- standard分词器:(默认的)它将词汇单元转换成小写形式,并去掉停用词(a、an、the等没有实际意义的词)和标点符号,支持中文采用的方法为单字切分(例如,‘你好’切分为‘你’和‘好’)
- simple分词器:首先通过非字母字符来分割文本信息,然后将词汇单元同一为小写形式。该分析器会去掉数字类型的字符
- Whitespace分词器:仅仅是去除空格,对字符没有lowcase(大小写转换)化,不支持中文;并且不对生成的词汇单元进行其他的标准化处理
- language分词器:特定语言的分词器,不支持中文
IK分词器
IK分词器在是一款 基于词典和规则 的中文分词器,提供了两种分词模式:ik_smart (智能模式)和ik_max_word (细粒度模式)
例如输入数据:
代码语言:javascript复制a
智能模式效果:
代码语言:javascript复制
细粒度模式:
代码语言:javascript复制
ElasticSearch集成Ik分词器
1、方式一
执行docker exec命令进入容器,下载IK分词器zip包https://github.com/medcl/elasticsearch-analysis-ik/releases,然后解压复制到elasticsearch的插件目录,然后重启容器即可,但是这样需要在集群里的每个容器都执行一遍,后续容器销毁了,创建新的容器还需要重复来一遍,费事费力,果断放弃。
2、方式二
基于elasticsearch的官方镜像,制作一个集成了IK分词器的新镜像,这样后续只要基于这个新镜像创建的新容器就自带了IK分词器,这里需要注意,由于elasticsearch每次版本变动比较大,所以在集成IK分词器时要注意版本对应
编写DockerFile
代码语言:javascript复制FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.0
#作者
MAINTAINER GongLJ
RUN cd /usr/share/elasticsearch && ./bin/elasticsearch-plugin install --patch https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.0/elasticsearch-analysis-ik-7.4.0.zip
构建镜像
代码语言:javascript复制在DockerFile所在目录运行:docker build --tag=elastic-custom .
构建过程报错:
原因是,安装 IK 分词器的时候需要一次确认交互,将dockerfile修改为:
代码语言:javascript复制FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.0
#作者
MAINTAINER GongLJ
RUN sh -c '/bin/echo -e "y" | /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.0/elasticsearch-analysis-ik-7.4.0.zip'
单机启动,测试Dockerfile是否正确
启动的时候需要添加参数:ES_JAVA_OPTS=-Xms512m -Xmx512m,否则会报错
启动成功,日志里也能看见插件ik分词器安装成功
编写docke-compose-custom.yml文件
更改镜像为集成了ik插件的elasticsearch镜像,这里我构建的镜像名称为:elasticsearch-ik-custom:7.4.0
代码语言:javascript复制version: '2.2'
services:
es01:
image: elasticsearch-ik-custom:7.4.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/node0:/usr/share/elasticsearch/data
- ./logs/node0:/usr/share/elasticsearch/logs
ports:
- 9200:9200
networks:
- elastic
es02:
image: elasticsearch-ik-custom:7.4.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/node1:/usr/share/elasticsearch/data
- ./logs/node1:/usr/share/elasticsearch/logs
networks:
- elastic
es03:
image: elasticsearch-ik-custom:7.4.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./logs/node2:/usr/share/elasticsearch/data
- ./logs/node2:/usr/share/elasticsearch/logs
networks:
- elastic
networks:
elastic:
driver: bridge
启动服务
代码语言:javascript复制docker-compose -f docker-compose-custom.yml up -d
启动elasticsearch-head服务
代码语言:javascript复制cd ~/app/elasticsearch-head
#后台运行
grunt server &