一、ES核心基本术语
集群(Cluster):由一个或多个节点组成的网络,共同提供索引和搜索功能。每个集群都有一个唯一的集群ID。
#查看集群名字和UUID
curl -X GET "localhost:9200"
节点(Node):构成集群的基本单元,每个节点都有一个唯一的ID,并且可以存储数据。
#查看所有节点信息
curl -X GET "localhost:9200/_cat/nodes"
#查看所有节点详细信息 ?v 参数表示带上详细信息
curl -X GET "localhost:9200/_cat/nodes?v"
索引(Index):类似于传统数据库中的数据库,是拥有相同结构文档的集合。每个索引都有一个名称,用于存储和检索特定类型的数据。ES中一切皆索引,数据无索引将无法查询,一个索引至少有一个分片。
#查看所有索引
curl -X GET "localhost:9200/_cat/indices?v"
#查看特定索引(例如索引名为my_index)的信息 ?pretty响应格式化为JSON
curl -X GET "localhost:9200/my_index?pretty"
索引规范
索引名称不要以".","_"开头;
索引名称必须小写;
生产环境中禁令避免使用通配符,尤其是删除操作;
文档(Document):实际存储数据的基本单元,相当于关系型数据库中的行。每个文档都是一个JSON对象,包含一组键值对,代表一个具体的实体或记录。
#index_name要查询的索引的名称,document_id要查看的文档的ID
curl -X GET "localhost:9200/index_name/_doc/document_id"
字段(Field):文档中的键值对,代表特定属性或数据项。每个字段都有一个数据类型(如字符串、整数、日期等)和相关的设置。
#index_name要查询的索引的名称 返回该索引的映射信息,包括每个字段的类型和配置 ?pretty响应格式化为JSON
curl -X GET "localhost:9200/index_name/_mapping?pretty"
ES中索引/文档/字段与MYSQL数据库对比
ES服务 | 数据库databases |
索引index | 表tables |
文档document | 行row |
域字段fields | 字段columns |
分片(Shard):索引的逻辑分区,用于水平分割数据,提高存储和查询的可扩展性。每个分片都是一个独立的Lucene索引,可以在集群的不同节点上分布。
#查看集群中的主分片分配情况 grep -w p精准查找主分片p
curl -X GET "localhost:9200/_cat/shards" | grep -w p
#查看集群中的主分片分配情况 ?h 要显示的列
curl -X GET "localhost:9200/_cat/shards?h=index,shard,prirep,state,docs,store,ip,node" | grep -w p
分片可以是主分片(primary shard)或副本分片(replica shard)
主分片可用于读写,副本分片用户只读。
主分片是索引中数据的主要部分,如果丢失或无法使用,则该分片的数据将不可搜索。
副本分片是主分片的副本,用于高可用性和提供冗余。
副本(Replica):分片的拷贝,用于提供数据冗余、提高查询性能和保证高可用性。每个主分片可以有零个或多个副本分片。
#查看集群中的主分片分配情况 grep -w p精准查找主分片r
curl -X GET "localhost:9200/_cat/shards" | grep -w r
集群分片与颜色的关系 集群颜色有绿色、黄色和红色
主分片状态 | 副本分片状态 | 集群健康颜色 |
所有主分片正常 | 所有副本分片正常 | 绿色 |
所有主分片正常 | 不是所有副本分片都正常 | 黄色 |
有主分片不正常 | 无论副本分片是否正常 | 红色 |
映射(Mapping):定义了索引中文档的结构,包括字段的数据类型、分析器设置等。映射决定了如何索引和搜索文档中的数据。
类型(Type):在Elasticsearch 7.x之前的版本中,一个索引可以包含多个类型,用于存储不同类型的文档。自Elasticsearch 7.0起,单一类型索引成为标准,类型概念已被弃用。
分析器(Analyzer):负责将文本字段分解为词汇单元,并进行标准化处理。分析器在索引和搜索时分别应用于文本,确保查询与索引数据的一致性。
二、ES中API接口 _cat命令详解
使用curl命令查看
#查看集群健康状态
curl -X GET "localhost:9200/_cat/health?v"
#查看所有节点信息
curl -X GET "localhost:9200/_cat/nodes?v"
# 查看所有索引及其相关信息
curl -X GET "localhost:9200/_cat/indices?v"
#查看所有分片信息
curl -X GET "localhost:9200/_cat/shards?v"
#查看特定索引的段信息
curl -X GET "localhost:9200/_cat/segments/my_index?v"
#查看索引文档数
curl -X GET "localhost:9200/_cat/count/my_index?v"
#查看节点磁盘和内存分配信息
curl -X GET "localhost:9200/_cat/allocation?v"
#查看集群中索引恢复状态
curl -X GET "localhost:9200/_cat/recovery?v"
#查看线程池信息
curl -X GET "localhost:9200/_cat/thread_pool?v"
使用postman接口测试工具查看
#新建一个get请求 查看集群健康状态
http://192.168.77.176:9200/_cat/health?v
三、ES索引管理API 官方文档
1.查看索引 查看get请求
#查看索引
#查看所有的索引的详细信息
http://192.168.77.176:9200/_cat/indices?v
2.创建索引 创建put请求
#创建默认索引,默认是一个分片和一个副本
http://192.168.77.176:9200/alibaby005
#创建指定的分片 分片指定3 副本还是默认的一个
http://192.168.77.176:9200/alibaby006
#body内容 json格式
{
"settings":{
"number_of_shards": 3
}
}
#创建指定的分片和副本 指定分片5 副本2
http://192.168.77.176:9200/alibaby007
#body内容 json格式
{
"settings":{
"number_of_shards": 5,
"number_of_replicas":2
}
}
3.修改索引 修改put请求
#修改副本
http://192.168.77.176:9200/alibaby007/_settings
#body内容 json格式
{
"number_of_replicas": 1
}
#修改分片,无法修改 报错Can't update non dynamic settings
http://192.168.77.176:9200/alibaby007/_settings
#body内容 json格式
{
"number_of_shards": 3
}
4.删除索引 删除delete请求
#删除索引
#删除单个索引
http://192.168.77.176:9200/alibaby005
#基于通配符删除多个索引
http://192.168.77.176:9200/alibaby*
5.关闭和打开索引 post请求 删除前先关闭一段时间
#关闭索引 alibaby005
http://192.168.77.176:9200/alibaby005/_close
#打开索引 alibaby005
http://192.168.77.176:9200/alibaby005/_open
四、索引别名
1.查看索引别名 get请求
#查看索引别名
http://192.168.77.176:9200/_aliases
2.添加索引别名 post请求
#添加索引别名 可以将多个索引打上同一个别名
http://192.168.77.176:9200/_aliases
#body内容 josn格式
{
"actions": [
{
"add": {
"index": "alibaby005",
"alias": "alibaby007_7.17.5"
}
},
{
"add": {
"index": "alibaby007",
"alias": "alibaby007_7.17.5"
}
}
]
}
3.修改索引别名 post请求 remove---add
#修改索引别名
http://192.168.77.176:9200/_aliases
#body内容 josn格式
{
"actions": [
{
"remove": {
"index": "alibaby007",
"alias": "alibaby007_7.17.5"
}
},
{
"add": {
"index": "alibaby007",
"alias": "alibaby007_2024"
}
}
]
}
4.删除别名 post请求
#删除别名
http://192.168.77.176:9200/_aliases
#body内容 josn格式
{
"actions": [
{
"remove": {
"index": "alibaby007",
"alias": "alibaby007_2024"
}
}
]
}
五、问题排查
1.分片数量不能修改 报错Can't update non dynamic settings
一旦分片数量修改,将无法正确找到数据。因为每条数据的唯一document_id已经分配到各自的分片上,当利用document_id进行查找时,利用文档写入分片编号计算公式={ hash(document_id) % (num_of_primary_shards},修改分片数量,可能无法定位到指定的分片,导致无法正确查找数据。
#如果需要改变分片数量,解决方案通常包括以下几个步骤:
创建新索引:创建一个具有所需分片数量的新索引。
重新索引数据:使用 Reindex API 将数据从旧索引迁移到新索引。
切换别名: 使用索引别名,将写入和搜索操作指向新索引。
删除旧索引:当确认数据已经迁移完成且无误后,可以删除旧索引。