Elasticsearch 索引管理详解:创建、配置与维护
索引是 Elasticsearch 中存储和检索数据的基本单元,类似于关系数据库中的 “表”。合理的索引管理(创建、配置、维护)直接影响查询性能和数据可靠性。以下基于 6.8.x 版本,详细介绍索引的核心操作。
索引的创建与基础操作
新建索引
使用 PUT
请求创建空索引,默认配置为 5 个主分片和 1 个副本分片。
1 | PUT blog // 创建名为blog的索引 |
响应示例(成功):
1 | { |
查看索引
查看单个索引:
1
GET blog // 返回索引的设置、映射等信息
查看多个索引(逗号分隔):
1
GET blog,video // 同时查看blog和video索引
查看所有索引:
1
GET _all // 或使用通配符 GET *
删除索引
1 | DELETE blog // 永久删除索引,谨慎操作 |
注意:删除索引不可逆,建议先备份数据(如通过快照)。
映射(Mapping):定义字段结构
映射用于定义索引中字段的类型、分词器等属性,类似于数据库表的 “schema”。
自动映射与手动映射
自动映射:当向不存在的索引写入文档时,ES 会根据字段值自动推断类型(如字符串→
text
+keyword
,数字→long
)。
示例:1
2
3
4
5
6
7// 写入文档时自动创建video索引及映射
PUT video/default/1
{
"title": "测试视频",
"duration": 300,
"tags": ["科技", "教育"]
}手动映射:推荐方式,可精确控制字段类型和行为(避免自动推断错误)。
示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20PUT testmapping // 创建索引并指定映射
{
"mappings": {
"default": { // 类型名(6.x支持,7.x后废弃)
"properties": { // 字段定义
"age": {
"type": "text", // 全文本类型
"fields": {
"keyword": { // 多字段:同时作为keyword用于聚合
"type": "keyword",
"ignore_above": 256
}
}
},
"duration": { "type": "long" }, // 数字类型
"keywords": { "type": "text" } // 全文本类型
}
}
}
}
查看映射
1 | GET video/_mapping/default // 查看video索引中default类型的映射 |
新增字段映射
已创建的索引可动态添加新字段(但不能修改已有字段的类型):
1 | PUT testmapping/_mapping/default // 为testmapping索引添加新字段 |
索引设置(Settings):配置分片与行为
索引设置用于控制分片数量、副本数量、刷新间隔等核心属性,分为静态设置(创建后不可修改)和动态设置(可实时调整)。
静态设置(创建时指定)
number_of_shards:主分片数量(默认 5),创建后不可修改。
示例:
1
2
3
4
5
6PUT index1 // 创建只有1个主分片的索引
{
"settings": {
"number_of_shards": 1
}
}
动态设置(可随时修改)
number_of_replicas
:副本分片数量(默认 1),影响可用性和查询性能。
示例:1
2
3
4
5
6PUT index1/_settings // 动态修改副本数量为2
{
"settings": {
"number_of_replicas": 2
}
}refresh_interval
:索引刷新间隔(默认 1 秒),控制数据写入后可查询的延迟(值越小延迟越低,性能消耗越大)。
示例:1
2
3
4
5
6PUT index1/_settings
{
"settings": {
"refresh_interval": "5s" // 每5秒刷新一次
}
}恢复默认值:将参数设为
null
即可恢复默认配置:1
2
3
4
5
6PUT index1/_settings
{
"settings": {
"refresh_interval": null // 恢复为默认1秒
}
}
查看设置
查看单个索引设置:
1
GET blog/_settings
查看多个索引设置:
1
GET index1,index2/_settings
查看所有索引设置:
1
GET _all/_settings
索引读写权限控制
通过 index.blocks
系列参数限制索引的读写行为:
1 | PUT index1/_settings |
索引的打开与关闭
关闭索引可暂时禁用其读写功能(释放资源但保留数据),适用于不常访问的历史数据。
关闭索引
1 | POST testmapping/_close // 关闭testmapping索引 |
- 关闭的索引不占用内存(除元数据),不能执行读写操作。
打开索引
1 | POST testmapping/_open // 重新打开索引 |
禁用关闭功能
全局配置 cluster.indices.close.enable: false
可禁止关闭索引(需在 elasticsearch.yml
中设置)。
索引别名(Aliases)
别名是索引的 “快捷方式”,可关联一个或多个索引,简化查询和索引切换(如零停机重建索引)。
添加别名
1 | POST _aliases // 为testmapping索引添加别名tm |
- 别名可关联多个索引(如
alias: "all_videos"
关联video_2023
、video_2024
)。
删除别名
1 | POST _aliases // 移除testmapping的别名tm |
查看别名
1 | GET _cat/aliases // 查看所有别名 |
注意
- 别名不能与索引名重复。
- 一个别名可关联多个索引,但一个索引可被多个别名关联。
索引复制与重建(Reindex)
_reindex
API 用于将数据从一个索引复制到另一个索引(支持条件筛选),适用于数据迁移、索引结构升级等场景。
基本复制(全量复制)
1 | POST _reindex // 将index1的数据复制到index2 |
- 目标索引(
index2
)需提前创建(可自定义分片、映射等)。 - 原索引需开启
_source
字段(默认开启),否则无法读取原始数据。
条件复制(过滤数据)
1 | POST _reindex // 仅复制age=20的文档 |
控制复制速度
通过 requests_per_second
限制每秒请求数,避免集群负载过高:
1 | POST _reindex?requests_per_second=500 // 每秒最多500个请求 |
监控与取消任务
查看所有任务:
1
GET _cat/tasks // 或 GET _tasks?actions=*reindex
取消任务(替换{task_id}为实际任务 ID):
1
POST _tasks/{task_id}/_cancel
v1.3.10