【Elasticsearch从入门到精通】第11篇:Elasticsearch索引API详解——索引创建、删除与别名管理
上一篇【第10篇】Elasticsearch REST API最佳实践——Content-Type、模糊性与访问控制
下一篇【第12篇】Elasticsearch读写原理——主备复制模型与数据一致性
摘要
索引(Index)是Elasticsearch中数据的逻辑容器,一切文档读写操作都在索引层面进行。掌握索引管理API是ES运维的核心技能之一。本文从索引创建开始,详解索引命名规则、settings(分片数、副本数、刷新间隔)和mappings(字段映射定义)的配置方法;接着系统讲解索引别名的各种用法——包括过滤别名(filtered alias)、路由别名(routed alias),以及如何利用别名实现零停机的索引重建;然后介绍索引的打开/关闭、收缩操作和索引模板(Index Template)的配置;最后覆盖索引的删除、存在性判断等常用运维操作。通过大量完整的REST API示例和对比表格,帮助读者快速掌握索引管理的方方面面。
一、创建索引
1.1 基本创建
最简单的方式——使用所有默认配置:
PUT/twitter响应:
{"acknowledged":true,"shards_acknowledged":true,"index":"twitter"}1.2 索引命名规则
索引名称必须遵循以下限制:
| 规则 | 说明 |
|---|---|
| 仅限小写字母 | 大写字母不被允许 |
| 禁止特殊字符 | \、/、*、?、"、<、>、|、空格、,、# |
| 禁止冒号 | 7.0+版本不支持冒号(:) |
| 禁止特殊开头 | 不能以-、_、+开头 |
| 禁止点号 | 不能是.或.. |
| 长度限制 | 不能超过255字节(UTF-8编码) |
合法索引名示例:twitter、my-index-001、logs_2026_05、app_v2_data
非法索引名示例:Twitter、my-index、logs:2026、.hidden、_internal
1.3 创建时指定settings和mappings
PUT/products{"settings":{"number_of_shards":3,"number_of_replicas":1,"refresh_interval":"5s"},"mappings":{"properties":{"name":{"type":"text","analyzer":"ik_max_word"},"category":{"type":"keyword"},"price":{"type":"double"},"description":{"type":"text"},"created_at":{"type":"date","format":"yyyy-MM-dd HH:mm:ss||epoch_millis"},"is_active":{"type":"boolean"}}}}1.4 Settings配置详解
创建索引时可以指定多种settings:
PUT/my_index{"settings":{"number_of_shards":3,"number_of_replicas":1,"refresh_interval":"5s","index":{"max_result_window":10000,"number_of_routing_shards":30,"analysis":{"analyzer":{"my_analyzer":{"type":"custom","tokenizer":"standard","filter":["lowercase","my_synonym_filter"]}}}}}}常用settings参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
number_of_shards | 1 | 主分片数量(创建后不可修改) |
number_of_replicas | 1 | 每个主分片的副本数(可动态修改) |
refresh_interval | 1s | 索引刷新间隔 |
max_result_window | 10000 | 搜索结果最大返回数 |
number_of_routing_shards | 与shards相同 | 用于索引分裂时路由计算 |
关键提醒:
number_of_shards在索引创建后不可修改!务必在创建前合理规划。如果需要更多分片,可以通过索引分裂或重建索引来实现。
二、索引的删除与判断
2.1 删除索引
# 删除单个索引DELETE /twitter# 删除多个索引DELETE /index1,index2# 使用通配符删除DELETE /logs-2026-0*警告:删除索引是不可逆操作!索引及其所有数据将永久丢失,无法恢复。请务必谨慎操作。
2.2 判断索引是否存在
# 存在返回200,不存在返回404HEAD /twitter# 使用curlcurl-I-uelastic:password-khttps://localhost:9200/twitter# HTTP/1.1 200 OK → 存在# HTTP/1.1 404 Not Found → 不存在2.3 打开和关闭索引
关闭的索引几乎不消耗集群资源(仅维护元数据),但无法进行读写操作。
# 关闭索引POST /my_index/_close# 打开索引POST /my_index/_open适用场景:暂时不使用的索引(如历史归档数据),可以关闭以释放资源,需要时再打开。
2.4 收缩索引
将一个索引收缩为具有较少主分片的新索引。目标分片数必须是源分片数的因数。
// 收缩前的准备工作PUT/my_source_index/_settings{"settings":{"index.blocks.write":true}}// 执行收缩(8个分片收缩为2个)POST/my_source_index/_shrink/my_target_index{"settings":{"index.number_of_shards":2,"index.number_of_replicas":1,"index.blocks.write":null}}收缩规则示例:
| 源分片数 | 可收缩为 |
|---|---|
| 8 | 4, 2, 1 |
| 12 | 6, 4, 3, 2, 1 |
| 15 | 5, 3, 1 |
| 7(质数) | 1 |
三、别名管理(Aliases)
别名是Elasticsearch中非常实用的功能,可以为索引创建一个或多个替代名称,用于简化查询、实现无缝切换和零停机索引重建。
3.1 基本别名操作
// 创建索引时同时创建别名PUT/products_v1{"aliases":{"products":{},"products_search":{}}}// 通过别名查询GET/products/_search{"query":{"match_all":{}}}// 通过API添加别名POST/_aliases{"actions":[{"add":{"index":"products_v1","alias":"products"}}]}// 删除别名POST/_aliases{"actions":[{"remove":{"index":"products_v1","alias":"products"}}]}3.2 过滤别名(Filtered Alias)
过滤别名允许你为别名添加过滤条件,用户通过别名查询时只能看到满足条件的文档。
POST/_aliases{"actions":[{"add":{"index":"products","alias":"products_active","filter":{"term":{"is_active":true}}}}]}// 通过过滤别名查询——只会返回is_active=true的文档GET/products_active/_search{"query":{"match_all":{}}}3.3 路由别名(Routed Alias)
路由别名可以指定查询和索引时的路由值,提高查询效率:
POST/_aliases{"actions":[{"add":{"index":"logs","alias":"logs_beijing","routing":"beijing"}}]}# 通过路由别名查询——只在北京分片上查询GET /logs_beijing/_search?q=error3.4 别名操作完整语法
POST/_aliases{"actions":[{"add":{"index":"index1","alias":"alias1","filter":{"term":{"status":"published"}},"routing":"1","search_routing":"1,2","index_routing":"1"}},{"remove":{"index":"index1","alias":"alias1"}},{"add":{"index":"index2","alias":"alias1"}}]}| 别名参数 | 说明 |
|---|---|
index | 关联的索引名称 |
alias | 别名名称 |
filter | 过滤条件(可选) |
routing | 读写共用的路由值 |
search_routing | 搜索时的路由值 |
index_routing | 索引时的路由值 |
3.5 使用别名实现零停机索引重建
这是一个非常实用的运维技巧——在不停服的情况下重建索引。
// 步骤1:创建新索引PUT/products_v2{"settings":{"number_of_shards":5},"mappings":{...}}// 步骤2:将旧索引数据复制到新索引POST/_reindex{"source":{"index":"products_v1"},"dest":{"index":"products_v2"}}// 步骤3:原子切换别名POST/_aliases{"actions":[{"remove":{"index":"products_v1","alias":"products"}},{"add":{"index":"products_v2","alias":"products"}}]}// 步骤4:验证新索引正常后,删除旧索引DELETE/products_v1零停机重建流程对比:
| 步骤 | 操作 | 集群影响 |
|---|---|---|
| 1 | 创建新索引 | 几乎无影响 |
| 2 | Reindex数据 | 消耗IO和CPU,但不影响读写 |
| 3 | 原子切换别名 | 瞬间完成,客户端无感知 |
| 4 | 删除旧索引 | 释放磁盘空间 |
四、索引模板(Index Template)
索引模板允许你预先定义索引的settings和mappings,当创建匹配特定模式的索引时自动应用模板配置。
4.1 创建索引模板
PUT/_template/logs_template{"index_patterns":["logs-*"],"settings":{"number_of_shards":3,"number_of_replicas":1,"refresh_interval":"10s"},"mappings":{"properties":{"@timestamp":{"type":"date"},"level":{"type":"keyword"},"message":{"type":"text"},"service":{"type":"keyword"},"host":{"type":"keyword"}}}}4.2 模板匹配验证
// 创建匹配logs-*模式的索引PUT/logs-2026-05-22// 查看自动应用的配置GET/logs-2026-05-22/_settingsGET/logs-2026-05-22/_mapping4.3 组件模板(Component Templates)与可组合模板
从Elasticsearch 7.8开始,推荐使用组件模板+可组合索引模板(Composable Index Templates):
// 创建组件模板1——settingsPUT/_component_template/logs_settings{"template":{"settings":{"number_of_shards":3,"number_of_replicas":1}}}// 创建组件模板2——mappingsPUT/_component_template/logs_mappings{"template":{"mappings":{"properties":{"@timestamp":{"type":"date"},"level":{"type":"keyword"},"message":{"type":"text"}}}}}// 创建可组合索引模板,引用组件模板PUT/_index_template/logs_template{"index_patterns":["logs-*"],"composed_of":["logs_settings","logs_mappings"],"priority":200}两种模板方式对比:
| 特性 | 传统模板 | 可组合模板 |
|---|---|---|
| 创建API | PUT /_template/ | PUT /_index_template/ |
| 可复用性 | 整体定义,不易复用 | 组件化,灵活复用 |
| 版本管理 | 无 | 支持version字段 |
| 优先级 | 无显式优先级 | priority参数控制 |
| 推荐度 | 7.x兼容 | 7.8+推荐使用 |
4.4 查看和删除模板
# 查看所有模板GET /_template# 查看指定模板GET /_template/logs_template# 删除模板DELETE /_template/logs_template五、索引的其他管理操作
5.1 修改索引settings(动态更新)
部分settings可以在运行时动态修改,无需重建索引:
// 修改副本数PUT/products/_settings{"number_of_replicas":2}// 修改刷新间隔PUT/products/_settings{"refresh_interval":"30s"}// 设置为只读PUT/products/_settings{"index.blocks.write":true}可动态修改 vs 不可动态修改的settings:
| 操作 | 是否可动态修改 | 说明 |
|---|---|---|
| 修改副本数 | 可以 | number_of_replicas |
| 修改刷新间隔 | 可以 | refresh_interval |
| 设置只读 | 可以 | index.blocks.write |
| 修改分片数 | 不可以 | 需要重建索引或使用shrink/split |
| 修改字段类型 | 不可以 | 需要重建索引 |
5.2 查看索引信息
# 查看索引settingsGET /products/_settings?pretty# 查看索引mappingsGET /products/_mapping?pretty# 同时查看settings和mappingsGET /products# 查看索引统计信息GET /products/_stats?pretty5.3 索引操作API速查表
| 操作 | HTTP方法 | API |
|---|---|---|
| 创建索引 | PUT | PUT /{index} |
| 删除索引 | DELETE | DELETE /{index} |
| 判断索引存在 | HEAD | HEAD /{index} |
| 打开索引 | POST | POST /{index}/_open |
| 关闭索引 | POST | POST /{index}/_close |
| 查看索引 | GET | GET /{index} |
| 修改settings | PUT | PUT /{index}/_settings |
| 查看mappings | GET | GET /{index}/_mapping |
| 收缩索引 | POST | POST /{index}/_shrink/{target} |
| 索引统计 | GET | GET /{index}/_stats |
六、总结与最佳实践
核心要点回顾
| 主题 | 关键API/配置 | 说明 |
|---|---|---|
| 索引创建 | PUT /{index} | 带settings和mappings创建 |
| 命名规则 | 小写+不含特殊字符 | 遵循命名限制 |
| 分片规划 | 30-50GB/分片 | 创建后不可修改 |
| 别名管理 | POST /_aliases | add/remove/filter/routing |
| 零停机重建 | 别名原子切换 | 旧数据reindex到新索引 |
| 索引模板 | PUT /_index_template/ | 预定义索引配置,自动应用 |
索引管理最佳实践
- 提前规划分片数:
number_of_shards创建后不可修改,务必根据数据量合理规划。宁可分片稍多,也不要太大。 - 使用别名做应用层抽象:应用程序只通过别名访问索引,不要直接使用索引名。这样索引重建、分片调整等运维操作对应用透明。
- 利用索引模板统一管理:对于基于时间的索引(日志等),使用索引模板确保所有索引配置一致。
- 采用可组合模板:Elasticsearch 7.8+推荐使用组件模板+可组合模板,提升配置的复用性和可维护性。
- 关闭不活跃的索引:对于长期不需要访问的历史索引,关闭以节省集群资源。
- 定期清理旧索引:结合ILM(索引生命周期管理)自动删除过期索引,避免分片数量无限增长。
- 重建索引前做好备份:虽然可以通过别名切换实现零停机,但重建前仍建议做好快照备份。
上一篇【第10篇】Elasticsearch REST API最佳实践——Content-Type、模糊性与访问控制
下一篇【第12篇】Elasticsearch读写原理——主备复制模型与数据一致性
