第四阶段 33 · index / mapping 管理(建索引、别名、reindex)

33 · index / mapping 管理(建索引、别名、reindex)

阶段:第四阶段 / 写入与索引管理

ES:建索引 / mapping / 别名 / reindex | PostgreSQL:DDL、CREATE TABLE、视图、表重建


1. 概念

索引管理相当于数据库的 DDL:

ES 操作 SQL 对照
PUT /index + mapping CREATE TABLE + 列定义
别名 alias 视图 / 可切换的表名
reindex INSERT INTO new SELECT * FROM old(表重建)
PUT /index/_mapping ALTER TABLE ADD COLUMN

本项目建索引入口:InsertToEsTask.createIndexCreateSalesIndexHandler

mapping 从 mappings/*.json(如 salesdata_idx.json)读取。


2. PostgreSQL 对照

sql 复制代码
CREATE TABLE salesdata (
  invoice_number varchar,
  net_amount     numeric,
  invoice_dt     date
);

-- 加列(ES 只能加不能改类型)
ALTER TABLE salesdata ADD COLUMN customer_group varchar;

-- 视图切换(类比别名)
CREATE VIEW salesdata_current AS SELECT * FROM salesdata_v2;

3. ES DSL

复制代码
# 建索引 + settings + mapping
PUT salesdata_idx
{
  "settings": { "number_of_shards": 3, "number_of_replicas": 1 },
  "mappings": {
    "properties": {
      "invoice_number": { "type": "keyword" },
      "net_amount":     { "type": "double" },
      "invoice_dt":     { "type": "date", "format": "yyyy-MM-dd" }
    }
  }
}

# 追加字段(不能改已有字段类型)
PUT salesdata_idx/_mapping
{ "properties": { "customer_group": { "type": "keyword" } } }

# 别名切换(原子)
POST _aliases
{
  "actions": [
    { "remove": { "index": "salesdata_v1", "alias": "salesdata" } },
    { "add":    { "index": "salesdata_v2", "alias": "salesdata" } }
  ]
}

# reindex:老索引数据搬到新索引
POST _reindex
{ "source": { "index": "salesdata_v1" }, "dest": { "index": "salesdata_v2" } }

4. Spring Boot 实现

java 复制代码
@Component
public class Doc33IndexAdmin {

    @Autowired
    private ElasticsearchClient elasticsearchClient;

    /** 建索引 + mapping(简化版,本项目实际读 mappings/*.json) */
    public void createIndex(String indexName) throws IOException {
        boolean exists = elasticsearchClient.indices()
                .exists(e -> e.index(indexName)).value();
        if (exists) {
            return;
        }
        elasticsearchClient.indices().create(c -> c
                .index(indexName)
                .settings(st -> st.numberOfShards("3").numberOfReplicas("1"))
                .mappings(m -> m
                        .properties("invoice_number", p -> p.keyword(k -> k))
                        .properties("net_amount", p -> p.double_(d -> d))
                        .properties("invoice_dt", p -> p.date(d -> d.format("yyyy-MM-dd")))));
    }

    /** 追加字段:类比 ALTER TABLE ADD COLUMN */
    public void addKeywordField(String indexName, String field) throws IOException {
        elasticsearchClient.indices().putMapping(m -> m
                .index(indexName)
                .properties(field, p -> p.keyword(k -> k)));
    }

    /** 原子切换别名 */
    public void switchAlias(String alias, String oldIndex, String newIndex) throws IOException {
        elasticsearchClient.indices().updateAliases(a -> a
                .actions(ac -> ac.remove(r -> r.index(oldIndex).alias(alias)))
                .actions(ac -> ac.add(ad -> ad.index(newIndex).alias(alias))));
    }
}

与本项目对照:建索引逻辑见 CreateSalesIndexHandler,mapping 新增字段时

参考 ADD_FIELD_SKILL 里 ES 部分(在 mapping 的 properties 追加字段)。


5. 坑与最佳实践

  1. mapping 不可改已有字段类型:改类型只能新建索引 + reindex + 切别名。
  2. 用别名解耦 :应用只认别名(如 salesdata),底层索引版本切换对上层透明、零停机。
  3. 动态映射风险:生产索引建议显式 mapping,或关掉动态映射,避免字段类型被自动猜错。
  4. 分片数建后不可改number_of_shards 定死,需重新规划只能 reindex;副本数可动态调。
  5. reindex 期间双写或停写:保证新老索引数据一致,切别名前校验文档数。

阶段小结

第四阶段完成后,你应该能:单文档增删改、bulk 批量写、按条件批量更新/删除、

建索引与 mapping、用别名做零停机切换、用 reindex 重建索引。

相关推荐
笃行35044 分钟前
SQLServer数据库迁移实录:十年老系统搬上 KingbaseES,T-SQL 基本没重写
数据库
落魄大学生之流水线上谋生计2 小时前
Java并发核心机制详解:线程池、CAS、AQS、锁升级
java·开发语言·数据库
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之邮件验证码发送(SMTP与API方式)
java·数据库·spring
砚底藏山河3 小时前
容错重试与指数退避:网络抖动手抖不再丢数据(魔码量化实战 #04)
java·数据库·python·金融
蓝速科技4 小时前
会议室门牌触控预约选型与落地实战指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
蓝速科技4 小时前
企业展厅数字人导览效果提升与选型实战指南丨蓝速科技
大数据·运维·数据库·人工智能·科技·microsoft
奔跑吧树袋熊4 小时前
多租户隔离该做到哪一层:从连接池到 ORM 的取舍
开发语言·数据库·oracle·系统架构
罗光记4 小时前
全能 Go Agent 框架 Covonaut v1.1.2发布:终端对话加入旁问与三档输出
数据库·经验分享·其他·百度·新浪微博
Htr_5 小时前
Anysite.io 使用指南:把整个 Web 变成 AI 智能体的数据库
前端·数据库·人工智能
Lyra_Infra5 小时前
记一次麒麟 Linux 下达梦数据库 (DM8) 部署与 MySQL 命令行无界面迁移踩坑指南
数据库·后端·dba