Elasticsearch别名管理 #

一、别名概述 #

1.1 别名作用 #

text
别名作用
├── 索引抽象
│   └── 应用层无需关心实际索引名
├── 无缝切换
│   └── 切换索引无需修改应用
├── 过滤视图
│   └── 创建索引的子集视图
└── 多索引查询
    └── 一个别名指向多个索引

1.2 别名特点 #

特点 说明
一对多 一个别名可指向多个索引
多对一 一个索引可有多个别名
过滤 别名可包含查询过滤
写入 可指定写入索引

二、别名操作 #

2.1 创建别名 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products_v1",
        "alias": "products"
      }
    }
  ]
}

2.2 删除别名 #

bash
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "products_v1",
        "alias": "products"
      }
    }
  ]
}

2.3 原子切换 #

bash
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "products_v1",
        "alias": "products"
      }
    },
    {
      "add": {
        "index": "products_v2",
        "alias": "products"
      }
    }
  ]
}

2.4 查看别名 #

bash
GET /_alias/products

GET /products_v1/_alias

GET /_alias

2.5 删除索引别名 #

bash
DELETE /products_v1/_alias/products

三、多索引别名 #

3.1 创建多索引别名 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-2024-01-01",
        "alias": "logs"
      }
    },
    {
      "add": {
        "index": "logs-2024-01-02",
        "alias": "logs"
      }
    }
  ]
}

或使用索引模式:

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-*",
        "alias": "logs"
      }
    }
  ]
}

3.2 查询多索引别名 #

bash
GET /logs/_search
{
  "query": {
    "match_all": {}
  }
}

查询会同时搜索所有关联索引。

四、过滤别名 #

4.1 创建过滤别名 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products",
        "alias": "products_apple",
        "filter": {
          "term": { "brand": "Apple" }
        }
      }
    }
  ]
}

4.2 使用过滤别名 #

bash
GET /products_apple/_search
{
  "query": {
    "match_all": {}
  }
}

自动应用过滤条件,只返回brand为Apple的文档。

4.3 多条件过滤 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products",
        "alias": "products_premium",
        "filter": {
          "bool": {
            "must": [
              { "term": { "brand": "Apple" } },
              { "range": { "price": { "gte": 1000 } } }
            ]
          }
        }
      }
    }
  ]
}

五、写入别名 #

5.1 设置写入索引 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-2024-01-01",
        "alias": "logs_write",
        "is_write_index": true
      }
    },
    {
      "add": {
        "index": "logs-2024-01-02",
        "alias": "logs_write"
      }
    }
  ]
}

5.2 写入操作 #

bash
POST /logs_write/_doc
{
  "message": "New log entry"
}

文档会写入到 logs-2024-01-01(is_write_index为true的索引)。

5.3 切换写入索引 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-2024-01-02",
        "alias": "logs_write",
        "is_write_index": true
      }
    },
    {
      "add": {
        "index": "logs-2024-01-01",
        "alias": "logs_write",
        "is_write_index": false
      }
    }
  ]
}

六、别名与索引模板 #

6.1 模板中定义别名 #

bash
PUT /_index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "aliases": {
      "logs_read": {}
    }
  }
}

6.2 滚动别名 #

bash
PUT /logs-000001
{
  "aliases": {
    "logs_write": {
      "is_write_index": true
    }
  }
}

POST /logs_write/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1000000
  }
}

七、别名路由 #

7.1 设置路由 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products",
        "alias": "products_apple",
        "filter": {
          "term": { "brand": "Apple" }
        },
        "routing": "apple"
      }
    }
  ]
}

7.2 索引路由 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products",
        "alias": "products_apple",
        "index_routing": "apple",
        "search_routing": "apple"
      }
    }
  ]
}

八、实际应用场景 #

8.1 索引版本管理 #

bash
POST /_aliases
{
  "actions": [
    { "remove": { "index": "products_v1", "alias": "products" } },
    { "add": { "index": "products_v2", "alias": "products" } }
  ]
}

应用始终使用 products 别名,无需修改代码。

8.2 多租户隔离 #

bash
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "orders",
        "alias": "orders_tenant1",
        "filter": {
          "term": { "tenant_id": "tenant1" }
        }
      }
    },
    {
      "add": {
        "index": "orders",
        "alias": "orders_tenant2",
        "filter": {
          "term": { "tenant_id": "tenant2" }
        }
      }
    }
  ]
}

8.3 时间序列数据 #

bash
POST /_aliases
{
  "actions": [
    { "add": { "index": "logs-2024-01-*", "alias": "logs_january" } },
    { "add": { "index": "logs-2024-02-*", "alias": "logs_february" } },
    { "add": { "index": "logs-*", "alias": "logs_all" } }
  ]
}

九、别名管理最佳实践 #

9.1 命名规范 #

text
别名命名建议
├── 使用业务名称
│   └── 如 products, orders
├── 区分读写
│   └── products_read, products_write
├── 包含环境
│   └── products_prod, products_dev
└── 包含租户
    └── orders_tenant1

9.2 使用建议 #

text
使用建议
├── 应用层使用别名
│   └── 不直接使用索引名
├── 版本切换使用别名
│   └── 无缝迁移
├── 多租户使用过滤别名
│   └── 数据隔离
└── 时间序列使用写入别名
    └── 配合rollover

十、总结 #

本章介绍了Elasticsearch别名管理:

  1. 别名提供索引的抽象层
  2. 支持一对多和多对一关系
  3. 过滤别名创建数据子集视图
  4. 写入别名支持索引切换
  5. 原子操作保证一致性
  6. 合理使用别名简化应用开发

下一步,我们将学习索引生命周期管理。

最后更新:2026-03-27