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