前言
本文可以帮助读者快速掌握 ElasticSearch 的基本用法。
讲解内容分为两个 Part:
- Part 1 讲解如何通过 Docker 部署 ElasticSearch 和 ES 的可视化控制台 Kibana
- Part 2 讲解 ES 的常用请求和 QueryDSL。
下载
首先下载 elasticsearch 和 kibana 镜像:
docker pull elasticsearch:7.4.2
docker pull kibana:7.4.2 # ES 的可视化工具,对标 navicat,版本一定要和 ES 对上
下载完成后,我们查看已下载的镜像列表,看是否成功:
docker images
配置
# 以后将 ES 的配置文件路径映射到此目录,可以将 /Users/dongyaoo/dockerMap/ 替换为自定义目录
mkdir -p /Users/dongyaoo/dockerMap/elasticsearch/config
# ES 的数据挂载到此文件夹
mkdir -p /Users/dongyaoo/dockerMap/elasticsearch/data
# ES 的插件挂载到此文件夹
mkdir -p /Users/dongyaoo/dockerMap/elasticsearch/plugins
# 设置 ES 可以被远程的任何机器所访问,把 host 配置写入我们宿主机的配置映射目录
echo "http.host: 0.0.0.0">>/Users/dongyaoo/dockerMap/elasticsearch/config/elasticsearch.yml
注意:ES 的 yml 配置文件中,每条配置中冒号后的空格不能省略,否则报错:
Exception in thread "main" ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]]
启动
docker run --name elasticsearch -p 9200:9200 -p 9300:9300
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m"
-v /Users/dongyaoo/dockerMap/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /Users/dongyaoo/dockerMap/elasticsearch/data:/usr/share/elasticsearch/data
-v /Users/dongyaoo/dockerMap/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-d elasticsearch:7.4.2
解释
docker run 启动容器
--name elasticsearch 将这个容器命名为 elasticsearch
-p 9200:9200 将容器 9200 端口映射到宿主机的 9200 端口,以后给 ES 发 Rest API 请求走 9200
-p 9300:9300 ES 在分布式集群状态下,它们节点之间的通信端口
-e "discovery.type=single-node" 设置 ES 为单节点模式运行
-e ES_JAVA_OPTS="-Xms128m -Xmx512m" 设置给 ES 分配多少内存,-Xms128m 表示初始内存 128m,-Xmx128m 表示最大内存 512m。生产环境分配几十G。
-v /Users/dongyaoo/dockerMap/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 映射配置文件
-v /Users/dongyaoo/dockerMap/elasticsearch/data:/usr/share/elasticsearch/data 映射 data
-v /Users/dongyaoo/elasticsearch/plugins:/usr/share/elasticsearch/plugins 映射插件,可以在宿主机装 ES 插件
-d elasticsearch 后台启动 ES,如果指定镜像版本,则为 -d elasticsearch:x.x.x
执行以下命令查看 ES 是否正常启动:
docker ps
kibana 可视化
kibana 有个配置文件 kibana.yml,为了能在宿主机同步修改 kibana 配置,我们让 kibana 容器挂在宿主机上的 kibana.yml。所以,我们先在宿主机搞一个 kibana.yml:
mkdir -p /Users/dongyaoo/dockerMap/kibana/config
vim /Users/dongyaoo/dockerMap/kibana/config/kibana.yml
我们将以下内容粘贴到 kibana.yml 中
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://12.34.56.78:9200" ] # 12.34.56.78 替换为自己的ip
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.hosts 内的 url 为 ES 主机地址,以后访问 kibana 地址,它会把请求转发到 ES。
注意:kibana 不能识别 127.0.0.1 或 localhost,所以一定填完整 ip。可以通过以下命令查询 ip:
# mac
ifconfig | grep "inet"
# windows
ipconfig
启动!
docker run --name kibana -p 5601:5601
-v /Users/dongyaoo/dockerMap/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
-d kibana:7.4.2
解释
-p 5601:5601 将容器 5601 端口映射到宿主机的 5601 端口
常用
访问地址 localhost:5601
,打开 Kibana 的 Dev Tools。
可以看到,Kibana 控制台主要由两个部分构成,左侧类似编辑器的面板用来编写提交给 Elasticsearch 的请求。右侧为response 面板,用来展示请求结果的响应。
查看所有索引(9200 为 ES 服务器端口)
http://localhost:9200/_cat/indices
PUT 请求(可以做 INSERT INTO ... VALUES,UPDATE ... SET,但必须带上 id)
localhost:9200/customer/external/1:保存一个数据,指明在哪个索引的哪个类型下保存,带上数据的 id。当多次请求发送的数据相同时,会改变数据的版本,不会保存多条记录。
POST 请求(也可以做新增和修改)
localhost:9200/customer/external:
- 不带 id 时,可以做新增,即使多次请求发送的数据一样,也会自动生成不同的 id,保存多条记录。
- 带上 id 时,则会改变数据的 _version,_seq_no,不会产生新的记录。
- 额外带上 _update,会对比原来的数据,如果不变,则 _version 和 _seq_no 也不变
GET 请求
localhost:9200/customer/external/1
{
"_index": "customer", // 索引
"_type": "external", // 类型
"_id": "1", // 文档
"_version": 2, // 版本(当多条数据的id一样时会升版本)
"_seq_no": 1, // 并发控制字段,每次更新就会递增,用来做乐观锁
"_primary_term": 1,
"found": true,
"_source": {
"name": "ES测试"
}
}
DELETE 请求
localhost:9200/customer/external/1:删除 id 为 1 的文档
localhost:9200/customer:直接将索引删除
bulk 批量 API
POST customer/external/_bulk
POST customer/external/_bulk
{"index": {"_id": "1"}}
{"name": "张三"}
{"index": {"_id": "2"}}
{"name": "李四"}
语法格式:
{action:{metadata}}\n
{request body }\n
{action:{metadata}}\n
{request body }\n
批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。
Query DSL(领域特定语言)
- 全文检索:GET bank/_search
- 非文本用 term 查询(和 match 一样,都用来匹配某个属性的值)
- 文本字段用 match | match_phrase查询
- match 会对搜索条件进行分词,例如“address”: "mill lane",任何文档包含 "mill" 或 "lane" 的都会搜出
- "address.keyword":表示精确匹配,任何文档等于 "mill lane" 的才会被搜出来
- match_phrase 不会对搜索条件分词,任何文档包含 "mill lane" 的才会被搜出来
- match 会对搜索条件进行分词,例如“address”: "mill lane",任何文档包含 "mill" 或 "lane" 的都会搜出
- 复合查询用 bool
- must 必须满足
- must not 必须不满足
- should 最好满足
- 并不是所有的查询都需要产生分数,特别是哪些仅用于 fiter 过滤的文档。为了不计算分数,elasticsearch会自动检查场景并且优化查询的执行。不参与评分更快。
聚合 aggs
语法如下:
"aggs":{ # 聚合
"aggs_name 这次聚合的名字,方便展示在结果集中":{
"AGG_TYPE聚合的类型(avg,term,terms)":{}
}
}
例子:
复杂子聚合:查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword",
"size": 10
},
"aggs": {
"balanceAgg": {
"avg": {
"field": "balance"
}
}
}
},
"balanceAgg": {
"avg": {
"field": "balance"
}
}
}
}
}
}
映射 _mapping
映射是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。
ElasticSearch7 去掉 type 概念。elasticsearch 是基于Lucene开发的搜索引擎,而 ES 中不同 type 下名称相同的字段最终在 Lucene 中的处理方式是一样的。例如,两个不同 type 下的两个 user_name 字段,在 ES 同一个索引下其实被认为是同一个字段,ES 必须在两个不同的 type 中定义相同的字段映射。否则,不同 type 中的相同字段名称就会在处理中出现冲突的情况,导致 Lucene 处理效率下降。去掉type就是为了提高 ES 处理数据的效率。
创建映射
PUT /my_index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"email": {"type": "keyword"},
"name": {"type": "text"}
}
}
}
映射增加字段
PUT /my_index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false // index 字段默认为 true,表示需要被 ES 检索
}
}
}
查看映射
GET my_index/_mapping
更新映射与数据迁移
// 6.0 以后写法
POST _reindex
{
"source": {
"index": "bank"
},
"dest": {
"index": "new_bank"
}
}
// 老版本写法
POST _reindex
{
"source": {
"index": "bank",
"type": "account"
},
"dest": {
"index": "new_bank"
}
}
分词
POST _analyze
{
"analyzer": "standard", // 内置英文分词器
"text": "The 2 Brown-Foxes bone."
}
POST _analyze
{
"analyzer": "ik_smart", // ik 分词器,中文
"text": "我是外国人"
}
ES安装插件
如果在宿主机做了插件文件夹映射,那么可以下载插件的 zip,解压到宿主机的插件文件夹
否则,我们进入容器:
docker exec -it elasticsearch /bin/bash
cd bin
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
elasticsearch-plugin list # 查看已安装的插件目录
通过 elasticsearch-plugin 安装的插件的配置文件在 /usr/share/elasticsearch/config 下
例如,我们进入 ik 分词器插件的配置文件夹,修改它的配置文件 IKAnalyzer.cfg.xml,使其加载我们的自定义词典。
vi /usr/share/elasticsearch/config/analysis-ik/IKAnalyzer.cfg.xml
作者:一位不愿留下姓名的BAT全栈程序员
原文链接:https://zhuanlan.zhihu.com/p/610935604
侵删