批量执行索引别名操作,在单个请求中完成多个别名的添加、删除或索引删除操作。
API #
POST /_aliases
API 的作用 #
该 API 允许在单个原子操作中执行多个别名相关的操作:
| 操作类型 | 描述 |
|---|---|
| add | 为索引添加别名 |
| remove | 从索引删除别名 |
| remove_index | 删除索引及其所有别名 |
使用场景 #
| 场景 | 描述 |
|---|---|
| 零停机重建 | 在新旧索引间切换别名 |
| 批量管理 | 一次性管理多个别名 |
| 时间序列 | 动态添加/移除时间索引 |
API 的参数 #
请求体参数 #
{
"actions": [
{
"add": {
"indices": ["index1", "index2"],
"alias": "alias1",
"filter": { ... },
"routing": "value",
"index_routing": "value",
"search_routing": "value",
"is_write_index": true,
"is_hidden": false
}
},
{
"remove": {
"indices": ["index1"],
"alias": "alias1"
}
},
{
"remove_index": {
"indices": ["index1"]
}
}
]
}
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
actions | 数组 | 必需 | 操作数组 |
add | 对象 | 否 | 添加别名操作 |
remove | 对象 | 否 | 删除别名操作 |
remove_index | 对象 | 否 | 删除索引操作 |
indices | 列表 | add/remove 必需 | 目标索引列表 |
alias | 字符串 | add/remove 必需 | 别名名称 |
filter | 对象 | 否 | 过滤查询 |
routing | 字符串 | 否 | 默认路由值 |
index_routing | 字符串 | 否 | 索引操作的路由值 |
search_routing | 字符串 | 否 | 搜索操作的路由值 |
is_write_index | 布尔值 | 否 | 是否为写入索引 |
is_hidden | 布尔值 | 否 | 是否隐藏别名 |
Query String 参数 #
| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
timeout | 时间值 | 否 | - | 等待响应的超时时间 |
master_timeout | 时间值 | 否 | - | 等待主节点响应的超时时间 |
示例 #
添加单个别名 #
POST /_aliases
{
"actions": [
{
"add": {
"index": "logs-2024-01",
"alias": "logs_current"
}
}
]
}
响应:
{
"acknowledged": true
}
添加多索引别名 #
POST /_aliases
{
"actions": [
{
"add": {
"indices": ["logs-2024-01", "logs-2024-02"],
"alias": "logs_current"
}
}
]
}
添加带过滤器的别名 #
POST /_aliases
{
"actions": [
{
"add": {
"index": "logs",
"alias": "error_logs",
"filter": {
"term": {
"level": "ERROR"
}
}
}
}
]
}
添加带路由的别名 #
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "routed_alias",
"routing": "user1",
"index_routing": "user1",
"search_routing": "user1,user2"
}
}
]
}
设置写入索引 #
POST /_aliases
{
"actions": [
{
"add": {
"index": "index_v2",
"alias": "my_index",
"is_write_index": true
}
},
{
"add": {
"index": "index_v1",
"alias": "my_index",
"is_write_index": false
}
}
]
}
删除别名 #
POST /_aliases
{
"actions": [
{
"remove": {
"index": "logs-2023-12",
"alias": "logs_current"
}
}
]
}
零停机索引重建 #
# 1. 创建新索引并加载数据
PUT /products_v2
POST /_reindex
{
"source": { "index": "products_v1" },
"dest": { "index": "products_v2" }
}
# 2. 切换别名
POST /_aliases
{
"actions": [
{
"remove": {
"index": "products_v1",
"alias": "products"
}
},
{
"add": {
"index": "products_v2",
"alias": "products"
}
}
]
}
批量操作多个别名 #
POST /_aliases
{
"actions": [
{
"add": {
"index": "logs-2024-02",
"alias": "logs_current"
}
},
{
"remove": {
"index": "logs-2023-12",
"alias": "logs_current"
}
},
{
"add": {
"index": "logs-2024-01",
"alias": "errors",
"filter": {
"term": { "level": "ERROR" }
}
}
}
]
}
删除索引及其别名 #
POST /_aliases
{
"actions": [
{
"remove_index": {
"index": "old_index"
}
}
]
}
时间序列索引滚动 #
# 创建新月份索引并更新别名
PUT /logs-2024-03
POST /_aliases
{
"actions": [
{
"remove": {
"index": "logs-2024-01",
"alias": "logs_current"
}
},
{
"add": {
"index": "logs-2024-03",
"alias": "logs_current"
}
}
]
}
多个写入索引配置 #
POST /_aliases
{
"actions": [
{
"add": {
"indices": ["index1", "index2"],
"alias": "search_alias"
}
},
{
"add": {
"index": "index2",
"alias": "write_alias",
"is_write_index": true
}
}
]
}
响应字段说明 #
| 字段 | 描述 |
|---|---|
acknowledged | 是否确认成功 |
使用场景 #
场景 1:零停机部署 #
# 完整的零停机重建流程
PUT /api_v2
# 同步数据
POST /_reindex
{
"source": { "index": "api_v1" },
"dest": { "index": "api_v2" },
"wait_for_completion": false
}
# 等待同步完成后切换别名
POST /_aliases
{
"actions": [
{ "remove": { "index": "api_v1", "alias": "api" } },
{ "add": { "index": "api_v2", "alias": "api" } }
]
}
场景 2:日志索引滚动 #
# 每月创建新索引并更新别名
PUT /logs-2024-03
POST /_aliases
{
"actions": [
{ "remove": { "index": "logs-2024-01", "alias": "logs" } },
{ "add": { "index": "logs-2024-03", "alias": "logs" } }
]
}
场景 3:过滤视图 #
# 为不同日志级别创建别名
POST /_aliases
{
"actions": [
{
"add": {
"index": "logs",
"alias": "error_logs",
"filter": { "term": { "level": "ERROR" } }
}
},
{
"add": {
"index": "logs",
"alias": "warn_logs",
"filter": { "term": { "level": "WARN" } }
}
}
]
}
场景 4:读写分离 #
# 读写分离配置
POST /_aliases
{
"actions": [
{
"add": {
"indices": ["index_v1", "index_v2"],
"alias": "index_read"
}
},
{
"add": {
"index": "index_v2",
"alias": "index_write",
"is_write_index": true
}
}
]
}
场景 5:多租户系统 #
# 为租户创建独立别名
POST /_aliases
{
"actions": [
{
"add": {
"index": "data",
"alias": "tenant1",
"filter": { "term": { "tenant_id": "tenant1" } },
"routing": "tenant1"
}
},
{
"add": {
"index": "data",
"alias": "tenant2",
"filter": { "term": { "tenant_id": "tenant2" } },
"routing": "tenant2"
}
}
]
}
注意事项 #
- 原子性:actions 数组中的操作是原子执行的,要么全部成功,要么全部失败
- 写入索引:一个别名只能有一个写入索引
- 别名顺序:先 remove 后 add 可以避免别名冲突
- 索引存在性:索引必须存在才能添加别名
- 性能影响:大量操作可能需要较长执行时间
常见错误 #
别名已存在 #
{
"error": {
"type": "invalid_alias_name_exception",
"reason": "Invalid alias name [logs], already exists"
}
}
多个写入索引 #
{
"error": {
"type": "illegal_argument_exception",
"reason": "Alias [my_index] has more than one write index"
}
}
索引不存在 #
{
"error": {
"type": "index_not_found_exception",
"reason": "no such index [nonexistent_index]"
}
}





