如何创建仅含tip UUID的Elasticsearch JSON记录并适配后续映射字段扩容?
Elasticsearch 可扩容存储方案落地分步指引
前置说明
默认你已经掌握ES基础操作、Java ES客户端调用能力,以下内容直接针对需求落地,跳过环境安装、基础API调用等入门内容。
步骤1:ES侧配置可扩容索引模板(核心解决字段扩容需求)
提前配置索引模板可以避免后续新增字段时反复手动修改索引Mapping,同时保证同业务线索引配置统一:
PUT _index_template/tip_data_template { "index_patterns": ["tip_data-*"], "template": { "settings": { "number_of_shards": 3, "number_of_replicas": 1, "dynamic": "true" }, "mappings": { "dynamic_templates": [ { "string_fields": { "match_mapping_type": "string", "mapping": { "type": "keyword", "ignore_above": 256 } } }, { "numeric_fields": { "match_mapping_type": "long", "mapping": { "type": "long" } } } // 后续新增日期、嵌套对象等字段类型,直接在此补充动态模板规则即可 ], "properties": { "tip_uuid": { "type": "keyword", "index": true } } } }, "priority": 200 }
以上配置说明:
- 所有命名符合
tip_data-*规则的索引都会自动继承该模板配置 - 初始仅定义
tip_uuid字段,符合第一阶段写入需求 - 开启动态映射+提前约定动态类型规则,后续新增字段无需手动修改Mapping,ES会自动按规则生成对应字段配置
步骤2:初始化业务索引
直接调用ES API创建索引即可,无需额外传Mapping配置,会自动继承步骤1的模板:
PUT tip_data-202406
可根据业务数据量选择按日/月/季度拆分索引,命名符合tip_data-*规则即可
步骤3:Java侧实现基础写入逻辑
不管使用Spring Data Elasticsearch还是RestHighLevelClient,都可以直接实现仅含tip_uuid的JSON写入,以下是RestHighLevelClient的示例代码:
// 构造索引请求,指定要写入的索引名 IndexRequest indexRequest = new IndexRequest("tip_data-202406"); // 可选:直接用tip_uuid作为文档ID,避免重复写入 String tipUuid = UUID.randomUUID().toString(); indexRequest.id(tipUuid); // 构造仅含tip_uuid的JSON数据 Map<String, Object> data = new HashMap<>(); data.put("tip_uuid", tipUuid); indexRequest.source(data, XContentType.JSON); // 执行写入 client.index(indexRequest, RequestOptions.DEFAULT);
该写入逻辑支持除tip_uuid外无任何字段的JSON写入,满足第一阶段需求。
步骤4:后续字段扩容操作
需要新增字段时无需修改现有索引配置,仅需两步即可完成:
- 如果新增字段类型不在现有动态模板规则内,先更新索引模板的
dynamic_templates配置,新规则会自动适配所有新写入的字段 - Java侧直接在实体类新增对应字段属性,写入时给字段赋值即可,ES会自动生成对应字段的Mapping,不会影响存量数据
可选优化项
- 数据量较大时可配置索引生命周期策略,自动冷热归档、删除历史数据,降低存储成本
- 不需要检索的字段可以在动态模板中配置
"index": false,节省存储空间 - 对查询性能要求高的场景可将
tip_uuid设置为路由键,同UUID的数据落到同一个分片,提升查询效率
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

