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

批量执行索引别名操作,在单个请求中完成多个别名的添加、删除或索引删除操作。

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"
      }
    }
  ]
}

注意事项 #

  1. 原子性:actions 数组中的操作是原子执行的,要么全部成功,要么全部失败
  2. 写入索引:一个别名只能有一个写入索引
  3. 别名顺序:先 remove 后 add 可以避免别名冲突
  4. 索引存在性:索引必须存在才能添加别名
  5. 性能影响:大量操作可能需要较长执行时间

常见错误 #

别名已存在 #

{
  "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]"
  }
}