📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

从索引中删除别名,释放别名名称或更新索引-别名映射关系。

API #

DELETE /{index}/_alias/{name}
DELETE /{index}/_alias/{name}
DELETE /{index}/_alias/{name}
DELETE /_alias/{name}
DELETE /_alias/{name}

API 的作用 #

从索引中删除别名,移除别名与索引的关联关系。

删除方式 #

API用途
DELETE /{index}/_alias/{name}从指定索引删除别名
DELETE /_alias/{name}删除别名(需指定索引参数)

删除的影响 #

情况影响
别名指向单个索引删除后别名不再存在
别名指向多个索引只从指定索引解除关联,别名仍指向其他索引
应用使用别名应用将无法通过别名访问已删除的索引

API 的参数 #

DELETE /{index}/_alias/{name} 参数 #

路由参数 #

参数类型是否必填描述
{index}字符串必需索引名称,支持逗号分隔多个索引或通配符
{name}字符串必需要删除的别名名称

Query String 参数 #

参数类型是否必填默认值描述
timeout时间值-等待响应的超时时间
master_timeout时间值-等待主节点响应的超时时间

DELETE /_alias/{name} 参数 #

路由参数 #

参数类型是否必填描述
{name}字符串必需要删除的别名名称

Query String 参数 #

参数类型是否必填默认值描述
index列表必需*-要从中删除别名的索引名称(逗号分隔)
timeout时间值-等待响应的超时时间
master_timeout时间值-等待主节点响应的超时时间

示例 #

基本删除 #

DELETE /my_index/_alias/my_alias

响应:

{
  "acknowledged": true
}

从多个索引删除别名 #

DELETE /index1,index2/_alias/shared_alias

使用通配符删除 #

DELETE /logs-*/_alias/temp_alias

使用 DELETE /_alias/{name} 删除 #

DELETE /_alias/my_alias?index=my_index

从多个索引删除(使用 URL 参数) #

DELETE /_alias/shared_alias?index=index1,index2,index3

零停机索引切换(删除旧关联) #

# 1. 新索引已创建并添加别名
PUT /products_v2/_alias/products

# 2. 从旧索引删除别名
DELETE /products_v1/_alias/products

设置超时时间 #

DELETE /my_index/_alias/my_alias?timeout=30s

批量删除多个别名 #

# 删除多个别名
DELETE /my_index/_alias/alias1,alias2,alias3

从多个索引删除特定别名 #

DELETE /index1,index2,index3/_alias/old_alias

使用通配符删除多个别名 #

DELETE /my_index/_alias/temp_*

验证删除 #

# 删除前检查
HEAD /my_index/_alias/my_alias

# 执行删除
DELETE /my_index/_alias/my_alias

# 删除后验证
HEAD /my_index/_alias/my_alias
# 返回 404 Not Found

删除时间序列索引的别名 #

# 从历史索引中删除当前别名
DELETE /logs-2023-*/_alias/logs_current

清理临时别名 #

# 删除所有临时别名
DELETE /_alias/temp_*

删除前先检查别名存在 #

# 检查别名
GET /my_index/_alias/*

# 如果存在则删除
DELETE /my_index/_alias/my_alias

使用管理 API 批量删除 #

# 更灵活的方式:使用管理索引别名 API
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "indices": ["index1", "index2"],
        "aliases": ["alias1", "alias2"]
      }
    }
  ]
}

响应字段说明 #

字段描述
acknowledged是否确认成功

使用场景 #

场景 1:零停机索引切换 #

# 完整的切换流程
PUT /products_v2
POST /_reindex
{
  "source": { "index": "products_v1" },
  "dest": { "index": "products_v2" }
}
PUT /products_v2/_alias/products
DELETE /products_v1/_alias/products

场景 2:索引滚动更新 #

# 新月份索引上线
PUT /logs-2024-03/_alias/logs_current

# 从旧索引移除别名
DELETE /logs-2024-01/_alias/logs_current

场景 3:清理过期别名 #

# 删除不再使用的别名
DELETE /archive_2023-*/_alias/current

场景 4:环境迁移 #

# 从测试环境移除生产别名
DELETE /test_*/_alias/prod

场景 5:重构别名结构 #

# 删除旧结构别名
DELETE /old_index_*/_alias/old_alias

# 创建新结构别名
PUT /new_index/_alias/new_alias

场景 6:多索引别名清理 #

# 从多个索引删除特定别名
DELETE /logs-2024-01,logs-2024-02/_alias/temp_search

场景 7:回滚操作 #

# 撤销别名更改
DELETE /new_index/_alias/production
PUT /old_index/_alias/production

注意事项 #

  1. 别名存在性:删除不存在的别名会返回错误
  2. 多索引别名:如果别名指向多个索引,只从指定索引删除
  3. 应用影响:确保应用不再使用已删除的别名
  4. 原子操作:使用 POST /_aliases 可实现多个删除的原子操作
  5. 验证删除:使用 HEAD 请求验证别名是否已删除

常见错误 #

别名不存在 #

{
  "error": {
    "type": "alias_not_found_exception",
    "reason": "alias [nonexistent] not found"
  }
}

解决:先检查别名是否存在

GET /_alias/nonexistent

索引不存在 #

{
  "error": {
    "type": "index_not_found_exception",
    "reason": "no such index [nonexistent_index]"
  }
}

解决:确保索引存在

别名不在指定索引上 #

DELETE /index1/_alias/my_alias
# 如果 my_alias 不在 index1 上

响应:

{
  "error": {
    "type": "alias_not_found_exception",
    "reason": "alias [my_alias] not found for index [index1]"
  }
}

解决:检查别名与索引的关联关系

缺少索引参数 #

DELETE /_alias/my_alias
# 缺少 index 参数

响应:

{
  "error": {
    "type": "illegal_argument_exception",
    "reason": "index is required"
  }
}

解决:添加 index 参数

DELETE /_alias/my_alias?index=my_index

最佳实践 #

1. 删除前验证 #

# 检查别名配置
GET /my_index/_alias/my_alias

# 确认后删除
DELETE /my_index/_alias/my_alias

2. 使用管理 API 批量操作 #

# 批量删除多个别名
POST /_aliases
{
  "actions": [
    { "remove": { "index": "index1", "alias": "alias1" } },
    { "remove": { "index": "index2", "alias": "alias2" } }
  ]
}

3. 零停机切换流程 #

# 1. 新索引准备
PUT /new_index

# 2. 数据同步
POST /_reindex
{
  "source": { "index": "old_index" },
  "dest": { "index": "new_index" }
}

# 3. 添加新别名
PUT /new_index/_alias/my_alias

# 4. 删除旧别名
DELETE /old_index/_alias/my_alias

# 5. 清理旧索引(可选)
DELETE /old_index

4. 监控删除操作 #

# 删除前后检查应用状态
curl -s 'http://localhost:9200/_cat/aliases?v' > before.txt
DELETE /my_index/_alias/my_alias
curl -s 'http://localhost:9200/_cat/aliases?v' > after.txt
diff before.txt after.txt

5. 自动化脚本 #

#!/bin/bash
# 安全删除别名脚本

ALIAS_NAME=$1
INDEX_NAME=$2

# 检查别名是否存在
if curl -s "localhost:9200/${INDEX_NAME}/_alias/${ALIAS_NAME}" | grep -q "\"${ALIAS_NAME}\""; then
    echo "Deleting alias ${ALIAS_NAME} from ${INDEX_NAME}..."
    curl -X DELETE "localhost:9200/${INDEX_NAME}/_alias/${ALIAS_NAME}"
    echo "Done."
else
    echo "Alias ${ALIAS_NAME} not found on ${INDEX_NAME}"
    exit 1
fi

6. 回滚计划 #

# 保存当前别名配置
GET /_aliases > backup_aliases.json

# 执行删除操作
DELETE /my_index/_alias/my_alias

# 如需回滚,从备份恢复
POST /_aliases
{
  "actions": [
    { "add": { "index": "my_index", "alias": "my_alias" } }
  ]
}