第四阶段 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.createIndex → CreateSalesIndexHandler,

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 重建索引。

相关推荐
时间的拾荒人3 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
隔窗听雨眠3 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__4 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
笃行3506 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
星恒随风9 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
无奈笑天下10 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
xiaoye-duck11 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
AllData公司负责人12 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析
2601_9679873713 小时前
Sqlite参考手册
数据库·python·sqlite·api·教程
隔窗听雨眠13 小时前
Oracle日志体系分层结构与故障定位路径
数据库·oracle·故障排查