Elasticsearch
倒排索引,面向文档存储,文档数据会被序列化为json格式后储存
-
Es与数据库:
- Mysql:擅长事物类型操作,可确保数据的安全和一致性
- Elasticsearch:擅长海量数据的搜索、分析、计算
-
索引(index):同类型文档的集合
-
映射(mapping):索引中文档的约束,类似于表结构约束
-
文档:一条数据就是一个文档,es中是json格式
-
字段:json文档中的的字段
安装
部署单点ES
-
创建网络
docker network create es-net
让es和kibana容器互联
-
加载镜像
docker pull elasticsearch:7.12.1
Mac在镜像名称前加
arm64v8/
-
运行:
docker run -d \ --name es \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1
-e
:设置环境变量"ES_JAVA_OPTS=-Xms512m -Xmx512m"
:内存大小"discovery.type=single-node"
:非集群模式"cluster.name=es-docker-cluster"
:设置集群名称"http.host=0.0.0.0"
:监听的地址,可外网访问
-v
:挂载es-data:/usr/share/elasticsearch/data
:挂载数据卷卷,绑定es的数据目录es-logs:/usr/share/elasticsearch/logs
:挂载数据卷,绑定es的日志目录es-plugins:/usr/share/elasticsearch/plugins
:挂载数据卷,绑定es的插件目录
--privileged
:授予逻辑卷访问权--network es-net
:加入一个名为es-net的网络中-p 9200:9200
:端口映射配置
-
检查是否正常运行:
curl http://localhost:9200
部署kibana
-
拉取镜像:
docker pull kibana:7.12.1
版本需与ES一致
-
部署:
docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1
--network es-net
:加入一个名为es-net的网络中,与elasticsearch在同一个网络中-e ELASTICSEARCH_HOSTS=http://es:9200"
:设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch-p 5601:5601
:端口映射配置
-
查看运行日志:
docker logs -f kibana
访问:http://127.0.0.1:5601
安装IK分词器
-
在线安装ik插件(Mac推荐)(较慢,不推荐)
网址:https://github.com/infinilabs/analysis-ik
#进入容器内部,Mac报错:docker exec -it -u 0 es /bin/bash docker exec -it elasticsearch /bin/bash # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip #查看ik插件 elasticsearch-plugin list #退出 exit #重启容器 docker restart elasticsearch
-
离线安装ik插件(推荐)
-
查看数据卷目录
docker volume inspect es-plugins
-
下载ik,解压安装宝,重命名为ik
- 网址:https://release.infinilabs.com/
-
将ik包拖到该目录(es容器插件的数据卷)
-
重启容器
# 容器容器 docker restart es # 查看es日志 docker logs -f es
-
测试
-
IK分词器包含两种模式:
ik_smart
:最少切分ik_max_word
:最细切分
GET /_analyze { "analyzer": "ik_max_word", "text": "中华人民共和国国歌" }
-
-
扩展词词典
-
配置ik分词器config目录中的IKAnalyzer.cfg.xml文件:
<?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">ext.dic</entry> </properties>
-
新建ext.dic,在词典中添加拓展词条
wow 绝绝子
-
重启elasticsearch
docker restart es # 查看日志 docker log -f elasticsearch
Tips:当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑
停用词词典
-
IKAnalyzer.cfg.xml配置文件内容添加:
<?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">ext.dic</entry> <!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典--> <entry key="ext_stopwords">stopword.dic</entry> </properties>
-
在 stopword.dic 添加停用词
赌博
-
重启elasticsearch
# 重启服务 docker restart elasticsearch docker restart kibana # 查看 日志 docker logs -f elasticsearch
-
测试效果:
GET /_analyze { "analyzer": "ik_max_word", "text": "中国不允许赌博!" }
当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑
拼音分词器
自动补全用,详情看自动补全
网址:https://github.com/medcl/elasticsearch-analysis-pinyin
7.12.1:https://github.com/medcl/elasticsearch-analysis-pinyin/releases/tag/v7.12.1
须保持和ES版本一致
-
windows安装:
-
解压
-
上传到虚拟机中,es的plugin目录
-
重启es
docker restart es
-
在kibana测试
POST /_analyze { "text": ["深岩银河是真滴好玩"], "analyzer": "pinyin" }
-
-
Mac安装:
-
进入es容器:
docker exec -it -u 0 es /bin/bash
-
下载py插件压缩包:
./bin/elasticsearch-plugin install https://github.com/infinilabs/analysis-pinyin/releases/download/v7.12.1/elasticsearch-analysis-pinyin-7.12.1.zip
-
查看py插件:
elasticsearch-plugin list
-
重启es:
docker restart es
-
在kibana测试:
POST /_analyze { "text": ["深岩银河是真滴好玩"], "analyzer": "pinyin" }
-
部署ES集群
创建es集群:
要求Linux虚拟机至少有4G的内存空间
-
编写一个docker-compose文件,如下示例:
version: '2.2' services: es01: image: elasticsearch:7.12.1 container_name: es01 environment: - node.name=es01 - cluster.name=es-docker-cluster - discovery.seed_hosts=es02,es03 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data01:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - elastic es02: image: elasticsearch:7.12.1 container_name: es02 environment: - node.name=es02 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data02:/usr/share/elasticsearch/data ports: - 9201:9200 networks: - elastic es03: image: elasticsearch:7.12.1 container_name: es03 environment: - node.name=es03 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - data03:/usr/share/elasticsearch/data networks: - elastic ports: - 9202:9200 volumes: data01: driver: local data02: driver: local data03: driver: local networks: elastic: driver: bridge
cluster.name
集群名称,es内集群名称一致会自动归类到同一集群下
-
es运行需要修改一些linux系统权限,修改
/etc/sysctl.conf
文件vi /etc/sysctl.conf
-
添加如下内容:
vm.max_map_count=262144
-
执行命令,让配置生效:
sysctl -p
-
通过docker-compose启动集群:
docker-compose up -d
集群状态监控
官网:https://github.com/lmenezes/cerebro
-
kibana
可以监控es集群,但新版本需依赖es的x-pack 功能,配置较复杂(不推荐) -
推荐使用
cerebro
来监控es集群状态夸克网盘有安装包解压即可:https://pan.quark.cn/s/6c282455342d
-
进入bin目录
-
双击cerebro.bat文件即可启动服务
-
访问http://localhost:9000 即可进入管理页面
-
输入ES任意节点的地址和端口,点击connect即可
绿色的条,代表集群处于绿色(健康状态)
-
创建索引库
用Kibana的DevTools创建
-
在DevTools中输入指令:
PUT /索引库名 { "settings": { "number_of_shards": 3, // 分片数量 "number_of_replicas": 1 // 副本数量 }, "mappings": { "properties": { // mapping映射定义 ... } } }
用cerebro创建
-
点击左上角
more
-->create index
-
填写索引库信息:索引库名、分片数量、备份数量
-
点击
create
即可 -
回到首页,即可查看索引库分片效果
实线是主分片,虚线是副本分片;主、副分片都在不同节点上
DSL
索引库操作
mapping属性
对索引库中文档的约束
-
type:字段数据类型,常见的类型:
-
字符串:
text
(可分词的文本)、keyword
(精确值) -
数值:long、integer、short、byte、double、float
-
布尔:boolean
-
日期:date
-
对象:object
-
地理坐标数据类型:
-
geo_point
由纬度和经度确定的一个点。
例如:“32.8752345,120.2981576”
-
geo_shape
有多个geo_point组成的复杂几何图形。
例如一条直线,“LINESTRING (-77.03653 38.897676,-77.009051 38.889939)”
-
-
-
index:是否创建索引,默认true
-
analyzer:选择分词器
-
properties:子字段
-
copy_to:字段拷贝,将当前字段拷贝到指定字段
//示例 "字段名1": { "type": "text", "analyzer": "ik_max_word" }, "bran": { "type": "keyword", "copy_to": "字段名1" }
创建索引库
PUT /{
索引库名}
{
"mappings": {
"properties": {
"字段名1": {
"type": "text ",
"analyzer": "ik_smart"
},
"字段名2": {
"type": "keyword",
"index": false
},
"字段名3": {
"type": "object",
"properties": {
"子字段1": {
"type": "keyword"
},
"子字段2": {
"type": "keyword"
}
}
},
// ...略
}
}
}
示例:
PUT /test
{
"mappings": {
"properties": {
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"email": {
"type": "keyword",
"index": false
},
"name": {
"type": "object",
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
}
}
查看、删除索引库
-
查看:
GET /索引库名
-
删除:
DELETE /索引库名
修改索引库
索引库和mapping一旦创建无法修改,但可添加新的字段
PUT /索引库名/_mapping
{
"properties": {
"新字段名": {
"type": "integer"
}
}
}
文档操作
新增文档
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
// ......
}
查看、删除文档
-
查看:
GET /索引库名/_doc/文档ID
-
删除:
DELETE /索引库名/_doc/文档ID
修改文档
-
全量修改
删除就文档,添加新文档
PUT /索引库名/_doc/文档ID { "字段1"</