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别名管理:
- 别名提供索引的抽象层
- 支持一对多和多对一关系
- 过滤别名创建数据子集视图
- 写入别名支持索引切换
- 原子操作保证一致性
- 合理使用别名简化应用开发
下一步,我们将学习索引生命周期管理。
最后更新:2026-03-27