【Elasticsearch】索引别名 aliases

索引别名

  • [🚫 1.错误演示](#🚫 1.错误演示)
    • [1.1 当前状态:](#1.1 当前状态:)
    • [1.2 执行以下命令会报错](#1.2 执行以下命令会报错)
  • [✅ 2.解决方案](#✅ 2.解决方案)
    • [2.1 方案 1:先移除旧索引的写入权限,再设置新索引](#2.1 方案 1:先移除旧索引的写入权限,再设置新索引)
    • [2.2 方案 2:使用原子操作一次性切换](#2.2 方案 2:使用原子操作一次性切换)
    • [2.3 方案 3:创建时不设置写入索引,后续再切换](#2.3 方案 3:创建时不设置写入索引,后续再切换)
  • [🔍 3.验证当前状态](#🔍 3.验证当前状态)
    • [3.1 查看别名指向的所有索引](#3.1 查看别名指向的所有索引)
    • [3.2 查看哪个索引是当前写入索引](#3.2 查看哪个索引是当前写入索引)
    • [3.3 查看所有包含写入索引的别名](#3.3 查看所有包含写入索引的别名)
  • [💡 4.实际应用场景](#💡 4.实际应用场景)
    • [4.1 场景:基于时间的索引滚动](#4.1 场景:基于时间的索引滚动)
    • [4.2 场景:索引重建](#4.2 场景:索引重建)
  • [🎯 5.总结](#🎯 5.总结)

在博文《【Elasticsearch】动手创建一个索引》中,我们创建了一个名为 test-index 的索引,并且指定索引别名为 log-index,同时设置其为写入索引。

如果此时我再次建立一个索引,名称为 test-index-01,别名为 log-index,也指定为写入索引,会发生什么呢?

您说得完全正确!这会报错,因为一个别名在同一时间只能指向一个作为写入索引的索引。

🚫 1.错误演示

1.1 当前状态:

  • test-index ← 别名 log-index(is_write_index: true)

1.2 执行以下命令会报错

json 复制代码
PUT /test-index-01
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "15s"
  },
  "aliases": {
    "log-index": {
      "is_write_index": true  // ← 冲突!
    }
  },
  "mappings": {
    "properties": {
      // ... 字段定义
    }
  }
}

错误信息类似:

✅ 2.解决方案

如果想要切换写入索引,有以下几种正确的做法。

2.1 方案 1:先移除旧索引的写入权限,再设置新索引

json 复制代码
// 步骤1:移除旧索引的写入权限
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test-index",
        "alias": "log-index",
        "is_write_index": false
      }
    }
  ]
}

// 步骤2:创建新索引并设置为写入索引
PUT /test-index-01
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "15s"
  },
  "aliases": {
    "log-index": {
      "is_write_index": true
    }
  },
  "mappings": {
    "properties": {
      "timestamp": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||epoch_millis"
      },
      "message": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
      // ... 其他字段
    }
  }
}

2.2 方案 2:使用原子操作一次性切换

json 复制代码
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test-index-01",
        "alias": "log-index",
        "is_write_index": true
      }
    },
    {
      "add": {
        "index": "test-index", 
        "alias": "log-index",
        "is_write_index": false
      }
    }
  ]
}

2.3 方案 3:创建时不设置写入索引,后续再切换

json 复制代码
// 步骤1:创建新索引(不设置写入索引)
PUT /test-index-01
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "15s"
  },
  "aliases": {
    "log-index": {}  // ← 只添加别名,不设置写入索引
  },
  "mappings": {
    // ... 字段定义
  }
}

// 步骤2:原子切换写入索引
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test-index-01",
        "alias": "log-index", 
        "is_write_index": true
      }
    },
    {
      "add": {
        "index": "test-index",
        "alias": "log-index",
        "is_write_index": false
      }
    }
  ]
}

🔍 3.验证当前状态

在执行任何操作前,您可以先检查当前别名状态:

3.1 查看别名指向的所有索引

json 复制代码
GET /_alias/log-index

3.2 查看哪个索引是当前写入索引

json 复制代码
GET /_cat/aliases/log-index?v

3.3 查看所有包含写入索引的别名

json 复制代码
GET /_cat/aliases?v&filter_path=is_write_index:true

💡 4.实际应用场景

这种设计在以下场景中很有用:

4.1 场景:基于时间的索引滚动

bash 复制代码
# 第1个月:logs-2024-01 是写入索引
# 第2个月:切换到 logs-2024-02 为写入索引
# 第3个月:切换到 logs-2024-03 为写入索引
# 但应用程序始终使用别名 "logs" 写入
  • 1️⃣ 设置 logs-2024-01 为写入索引。
  • 2️⃣ 通过别名往索引中写入数据。
  • 3️⃣ 可以看到此时数据写入了 logs-2024-01。
  • 4️⃣ 切换写入索引为 logs-2024-02。
  • 5️⃣ 可以看到 logs-2024-02 此时已成为别名 logs 的写入索引了。
  • 6️⃣ 再次通过索引别名往索引中写入数据。
  • 7️⃣ 可以观察到,此时写入的数据已经存储到了 logs-2024-02 中。

4.2 场景:索引重建

bash 复制代码
# 阶段1:products-v1 是写入索引
# 阶段2:创建 products-v2,数据迁移
# 阶段3:切换写入索引到 products-v2
# 阶段4:下线 products-v1

🎯 5.总结

  • ✅ 一个别名可以指向多个索引
  • ✅ 但只能有一个索引设置为 is_write_index: true
  • ✅ 切换写入索引需要使用原子操作
  • ✅ 应用程序可以始终使用别名,无需关心底层索引变化

这种机制正是 Elasticsearch 实现索引滚动、零停机重建等高级功能的基础。

相关推荐
演艺大赏35 分钟前
NiFi 起不来、登不上、节点被挤掉:一份按日志定位的排错清单
大数据
freejackman40 分钟前
【实战三】撕开脱敏盲区:深度解析 CASE WHEN 与窗口函数血缘
大数据·数据库·sql
Thanks_ks4 小时前
MySQL 的索引是什么?用图书馆的目录讲明白
数据库·sql·mysql·索引·联合索引·explain·慢查询优化
wafrdggh12 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
大大大大晴天14 小时前
OLTP、OLAP、数据湖、数据集市、湖仓一体到底是什么关系?
大数据
正在走向自律17 小时前
AI Agent 落地这一年:从“能跑起来”到“敢放出去”
大数据·人工智能·ai agent·智能体·mcp·a2a
freejackman18 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
goujunwe19 小时前
GEO 内容的“可摘录性”打磨技巧:段落、表格、小标题怎么写,方便大模型提取独立答案块
大数据·人工智能
小田学Python19 小时前
DeepSeek Harness 完整上手指南:安装部署 + 必装插件 + 用一周就回不去的功能
大数据·大模型·agent·ai工具·deepseek
成都蜀味缘餐饮技术培训学校1 天前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台