01-ElasticSearch
Elasticsearch
ES与关系型数据库的对比
7.x版本中type的概念已经被删除了
优点
- 面向开发者友好,屏蔽了Lucene的复杂特性,集群自动发现(cluster discovery)
- 自动维护数据在多个节点上的建立
- 会帮我做搜索请求的负载均衡
- 自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有任何数据丢失
- ES基于Lucene提供了很多高级功能:复合查询、聚合分析、基于地理位置等。
- 对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别数据;对于小公司,开箱即用,门槛低上手简单。
- 相比传统数据库,提供了全文检索,同义词处理(美丽的cls>漂亮的cls),相关度排名。聚合分析以及海量数据的近实时(NTR)处理,这些传统数据库完全做不到。
基本概念
- ES节点
- Master节点 主节点
- 每个集群只有一个master节点,尽量避免将maser节点作为数据节点
- voting节点 投票节点
- 仅仅为投票节点,即使设置为data.master为true,也不会参选,但是可以作为数据节点
- coordinating 协调节点
- 每一个节点都是隐式的协调节点,如果同时设置了data.master = false和data.data=false,那么此节点将成为仅协调节点。
- data 节点 数据节点
- Master-eligible node 候选节点
- Master节点 主节点
node.master和node.data
- node.master = true node.data = true
- 这是ES节点默认配置,既作为候选节点又作为数据节点,这样的节点一旦被选举为Master,压力是比较大的,通常来说Master节点应该只承担较为轻量级的任务,比如创建删除索引,分片均衡等。
- node.master = true node.data = false
- 只作为候选节点,不作为数据节点,可参选Master节点,当选后成为真正的Master节点。
- node.master=false node.data=true
- 不作为候选节点,但是作为数据节点,这样的节点主要负责数据存储和查询服务
- node.master = false node.data = false
- 既不当候选节点,也不作为数据节点,那就是仅协调节点,负责负载均衡
基本操作
集群健康值
- 健康值检查
- _cat/health
- _cluster/health
- 健康值状态
- 绿色:所有Primary和Replica均为active,集群健康
- 黄色:至少一个Replica不可用,但是所有Primary均为active,数据仍然是可以保证完整性的。
- 红色:至少有一个Primary为不可用状态,数据不完整,集群不可用。
索引基本操作
查看单个索引
- http://127.0.0.1:9200/shopping
- get请求/删除是post请求
- 返回信息
{ "shopping"【索引名】 : { "aliases"【别名】 : {}, "mappings"【映射】 : {}, "settings"【设置】 : { "index"【设置 - 索引】 : { "creation_date"【设置 - 索引 - 创建时间】 : "1614265373911", "number_of_shards"【设置 - 索引 - 主分片数量】 : "1", "number_of_replicas"【设置 - 索引 - 副分片数量】 : "1", "uuid"【设置 - 索引 - 唯一标识】 : "eI5wemRERTumxGCc1bAk2A", "version"【设置 - 索引 - 版本】 : { "created": "7080099" }, "provided_name"【设置 - 索引 - 名称】 : "shopping" } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
+ 查看所有索引信息
+ http://127.0.0.1:9200/_cat/indices?v
+ get请求
+ 返回结果
+ | 表头 | 含义 |
| -------------- | ------------------------------------------------------------ |
| health | 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常) |
| status | 索引打开、关闭状态 |
| index | 索引名 |
| uuid | 索引统一编号 |
| pri | 主分片数量 |
| rep | 副本数量 |
| docs.count | 可用文档数量 |
| docs.deleted | 文档删除状态(逻辑删除) |
| store.size | 主分片和副分片整体占空间大小 |
| pri.store.size | 主分片占空间大小 |
### 文档基本操作
#### 创建文档
+ http://127.0.0.1:9200/shopping/_doc
+ post请求
+ 请求体内容
+ ```json
{
"title":"小米手机",
"category":"小米",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":3999.00
}
返回结果
{ "_index"【索引】 : "shopping", "_type"【类型-文档】 : "_doc", "_id"【唯一标识】 : "Xhsa2ncBlvF_7lxyCE9G", #可以类比为 MySQL 中的主键,随机生成 "_version"【版本】 : 1, "result"【结果】 : "created", #这里的 create 表示创建成功 "_shards"【分片】 : { "total"【分片 - 总数】 : 2, "successful"【分片 - 成功】 : 1, "failed"【分片 - 失败】 : 0 }, "_seq_no": 0, "_primary_term": 1 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31+ 自定义ID创建
+ 创建时指定:http://127.0.0.1:9200/shopping/_doc/1
+ 注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
#### 修改文档
+ 完全覆盖,与创建文档一致,但是要使用put操作,请求体中写入覆盖的数据
+ 局部更新
+ 使用POST方式,
+ http://127.0.0.1:9200/shopping/_update/2001
+ 报文体中写入要更新的数据
#### 删除文档
#### 主键查询和全查询
+ 主键查询
+ http://127.0.0.1:9200/shopping/_doc/1001
+ get
+ 返回结果
+ ```json
{
"_index"【索引】 : "shopping",
"_type"【文档类型】 : "_doc",
"_id": "1",
"_version": 2,
"_seq_no": 2,
"_primary_term": 2,
"found"【查询结果】 : true, # true 表示查找到, false 表示未查找到
"_source"【文档源信息】 : {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999.00
}
}
全部查询
高级用法
条件查询
- http://127.0.0.1:9200/shopping/_search?q=属性名:属性值
- 也可以使用请求体
{ "query": { "match": { "category": "小米" } }, //高亮显示 "highlight":{ "fields":{ "属性值k1":"" } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22+ ```json
//全量查询
{
"quer":{
"match_all":{
}
},
//分页查询
"from":0, //其实索引
"size":2, //页容量
//选择要回显的内容
"_source":[
"属性值key1",
"属性值key2"
],
//排序
"sort":{
"属性值key3":{
"order":"asc"
}
}
}
组和查询
{ "query":{ "bool":{ //必须命中的条件 "must":[ { "match":{ "category": "小米", } }, { "match":{ "属性k2": "属性v2", } } ], //or条件 "should":{ { "match":{ "属性k3": "属性v3", } } }, //范围查询 "filter":{ "range":{ "属性值4":{ //大于 "gt":"", //小于 "lt":"" } } } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
### 聚合操作
+ ```json
{
//聚合操作
"aggs":{
//自定义统计结果名称
"price_group":{
//分组
"terms":{
//分组字段
"field":"price"
}
},
"price_avg":{
"avg":{
"field":"price"
}
}
}
}
映射关系
{ "properties":{ "name":{ "type":"text", //是否可以被索引 "index":true }, "sex":{ //不能够分词,必须完整匹配 "type":"keyword", "index":true } } }
01-ElasticSearch
https://x-leonidas.github.io/2022/02/01/11技术栈/Lucene/01-ElasticSearch/