一、es集群的配置搭建
准备三台服务器:192.168.81.130、192.168.81.131、192.168.81.132
1、修改每台主机的内核参数vm.max_map_count
编辑/etc/sysctl.conf
vm.max_map_count = 655350
然后执行sysctl -p
2、将es镜像pull下来,本文采用elasticsearch:7.1.1
3、编辑docker-compose.yaml文件
version: '3'
services:
elasticsearch: # 服务名称
image: elasticsearch:7.1.1 # 使用的镜像
container_name: elasticsearch # 容器名称
restart: always # 失败自动重启策略
environment:
- node.name=node-130 # 节点名称,集群模式下每个节点名称唯一
- network.publish_host=192.168.81.130 # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
- network.host=0.0.0.0 # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
- discovery.seed_hosts=192.168.81.130,192.168.81.131,192.168.81.132 # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
- cluster.initial_master_nodes=192.168.81.130,192.168.81.131,192.168.81.132 # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
- cluster.name=es-cluster # 集群名称,相同名称为一个集群, 三个es节点须一致
# - http.cors.enabled=true # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
# - http.cors.allow-origin="*" # 表示支持所有域名 // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
- bootstrap.memory_lock=true # 内存交换的选项,官网建议为true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
ulimits: # 栈内存的上限
memlock:
soft: -1 # 不限制
hard: -1 # 不限制
volumes:
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
- ./data:/usr/share/elasticsearch/data # 存放数据的文件, 注意:这里的esdata为 顶级volumes下的一项。
ports:
- 9200:9200 # http端口,可以直接浏览器访问
- 9300:9300 # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。
4、编辑elasticsearch.yml配置文件
network.host: 0.0.0.0
http.cors.enabled: true # 是否支持跨域
http.cors.allow-origin: "*" # 表示支持所有域名
5、初次运行的时候,注释掉compose文件中的volume,需要先运行起来,然后将容器中的data目录cp到宿主机上,否则报错
执行docker-compose up -d
然后执行docker cp elasticsearch:/usr/share/elasticsearch/data
6、然后执行docker-compose down,然后将compose文件中的volume选项打开再启动即可完成
7、访问web界面http://192.168.81.132:9200/_cluster/health?pretty
至此,es搭建完毕!
参考文献:
二、关于elasticsearch的分析器
参考文献:
1、空白字符分析器:whitespace
按空白字符 —— 空格、tabs、换行符等等进行简单拆分 —— 然后假定连续的非空格字符组成了一个语汇单元。
2、标准分析器:standard
使用 Unicode 文本分割算法 (定义来源于 Unicode Standard Annex #29)来寻找单词 之间 的界限,并且输出所有界限之间的内容。 Unicode 内含的知识使其可以成功的对包含混合语言的文本进行分词。
标点符号可能是单词的一部分,也可能不是,这取决于它出现的位置:
3、simple分析器:当它遇到只要不是字母的字符,就将文本解析成term,而且所有的term都是小写的。
4、stop分析器: stop 分析器 和 simple 分析器很像,唯一不同的是,stop 分析器增加了对删除停止词的支持。默认用的停止词是 _englisht_
(PS:意思是,假设有一句话“this is a apple”,并且假设“this” 和 “is”都是停止词,那么用simple的话输出会是[ this , is , a , apple ],而用stop输出的结果会是[ a , apple ],到这里就看出二者的区别了,stop 不会输出停止词,也就是说它不认为停止词是一个term)
(PS:所谓的停止词,可以理解为分隔符)
5、中英文分析器:smartCN
一个简单的中文或中英文混合文本的分词器
这个插件提供 smartcn analyzer 和 smartcn_tokenizer tokenizer,而且不需要配置
# 安装
bin/elasticsearch-plugin install analysis-smartcn
# 卸载
bin/elasticsearch-plugin remove analysis-smartcn
6、中文分词器:ik
参考:https://github.com/medcl/elasticsearch-analysis-ik
下面为Dockerfile
FROM elasticsearch:7.6.2
ADD https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip /usr/share/elasticsearch/plugins/ik/
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' > /etc/timezone \
&& cd /usr/share/elasticsearch/plugins/ik/ \
&& unzip elasticsearch-analysis-ik-7.6.2.zip \
&& rm -f elasticsearch-analysis-ik-7.6.2.zip
7、curl命令对es的操作示例:
获取:curl -XGET 'http://localhost:9200/odin_device_device_collection'
删:curl -XDELETE 'http://localhost:9200/odin_device_device_collection'
插:curl -XPUT 'http://localhost:9200/odin_device_device_collection' -H 'Content-Type: application/json' -d '数据内容'
查:curl -XGET "http://localhost:9200/odin_device_device_collection/_doc/_search" -H 'Content-Type: application/json' -d'{"query": {"match_all": {}},"from": 0,"size": 300}'
清空:curl -XPOST "http://localhost:9200/odin_device_device_collection/_doc/_delete_by_query" -H 'Content-Type: application/json' -d'{"query": {"match_all": {}}}'