基于 DOCKER 快速部署 ELASTICSEARCH 集群-集成IK分词器

上篇文章介绍了如何基于 DOCKER 快速部署 ELASTICSEARCH 集群,接下来介绍如何在容器里集成IK分词器

什么是分词器?为什么要分词器?

Es默认的分词器,在中文的分词上并不友好,会将语句每个字进行分词作为索引,所以在使用Term关键字查询的时候多个汉字无法命中文档。这个时候就需要一个合理的分词规则,将一个完整的语句划分为多个比较复合表达逻辑的独立的词条。分词器包含三个部分:

  • character filter:分词之前的预处理,过滤掉HTML标签、特殊符号转换(例如,将&符号转换成and、将|符号转换成or)等
  • tokenizer:分词
  • token filter:标准化

ElasticSeach内置分词器

  1. standard分词器:(默认的)它将词汇单元转换成小写形式,并去掉停用词(a、an、the等没有实际意义的词)和标点符号,支持中文采用的方法为单字切分(例如,‘你好’切分为‘你’和‘好’)
  2. simple分词器:首先通过非字母字符来分割文本信息,然后将词汇单元同一为小写形式。该分析器会去掉数字类型的字符
  3. Whitespace分词器:仅仅是去除空格,对字符没有lowcase(大小写转换)化,不支持中文;并且不对生成的词汇单元进行其他的标准化处理
  4. language分词器:特定语言的分词器,不支持中文

IK分词器

IK分词器在是一款 基于词典和规则 的中文分词器,提供了两种分词模式:ik_smart (智能模式)和ik_max_word (细粒度模式)

例如输入数据:

a

智能模式效果:

 

细粒度模式:

 

ElasticSearch集成Ik分词器

1、方式一

执行docker exec命令进入容器,下载IK分词器zip包https://github.com/medcl/elasticsearch-analysis-ik/releases,然后解压复制到elasticsearch的插件目录,然后重启容器即可,但是这样需要在集群里的每个容器都执行一遍,后续容器销毁了,创建新的容器还需要重复来一遍,费事费力,果断放弃。

2、方式二

基于elasticsearch的官方镜像,制作一个集成了IK分词器的新镜像,这样后续只要基于这个新镜像创建的新容器就自带了IK分词器,这里需要注意,由于elasticsearch每次版本变动比较大,所以在集成IK分词器时要注意版本对应

编写DockerFile

FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.0
#作者
MAINTAINER GongLJ <G381413362@163.com>
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

构建镜像

在DockerFile所在目录运行:docker build --tag=elastic-custom .

构建过程报错:

原因是,安装 IK 分词器的时候需要一次确认交互,将dockerfile修改为:

FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.0
#作者
MAINTAINER GongLJ <G381413362@163.com>
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

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

启动服务

docker-compose -f docker-compose-custom.yml up -d

启动elasticsearch-head服务

cd ~/app/elasticsearch-head
#后台运行
grunt server &

验证IK分词器

 

 

 

 

 

发表评论

邮箱地址不会被公开。 必填项已用*标注