【Elasticsearch】 es 6.8 的 type _doc

本文介绍了Elasticsearch 6.8中_type的改变,包括移除_type的概念,如何指定_type以及未来的发展趋势。在6.8版本中,_doc成为默认特殊_type,允许在首次写入数据时指定,而在7.0及以后版本,将进一步移除_type相关API,转向使用join字段处理父子关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<think>我们正在处理Elasticsearch在更新映射时因多个类型导致的IllegalArgumentException错误。 根据引用[1][2][3],错误信息为:“Rejecting mapping update to [index_name] as the final mapping would have more than 1 type: [type1, type2]” 原因:从Elasticsearch 6.0.0开始,一个索引只能包含一个映射类型(mapping type)。在5.x版本中,一个索引可以包含多个类型,但6.0.0及更高版本中不再支持,并且计划在7.0.0中完全移除类型(mapping types)[^3]。 因此,在6.x版本中,如果尝试在一个索引中创建多个类型,或者更新映射时导致索引中存在多个类型,就会抛出此异常。 解决方案: 1. 确保每个索引只有一个类型。在6.x中,建议每个索引只有一个类型,并且类型名可以自定义(但通常使用“_doc”作为固定类型名,为7.0完全移除类型做准备)。 2. 如果数据模型中需要多个类型,则应该使用多个索引,每个索引对应一个类型。 3. 如果是从旧版本(5.x)升级到6.x,并且索引中已经存在多个类型,那么需要重新设计数据模型,将多类型索引拆分为多个单类型索引,并重建索引。 具体步骤: 步骤1:检查当前索引的映射,确认是否包含多个类型。 使用命令:GET /index_name/_mapping 步骤2:如果发现索引中存在多个类型,则需要将数据迁移到新的索引(每个类型一个索引)。 例如,原索引为“my_index”,包含两个类型“type1”和“type2”,则创建两个新索引“my_index_type1”和“my_index_type2”,然后分别将原索引中两种类型的数据迁移到新索引。 步骤3:使用Reindex API进行数据迁移。 例如,迁移type1的数据: ``` POST _reindex { "source": { "index": "my_index", "type": "type1" }, "dest": { "index": "my_index_type1" } } ``` 同样,迁移type2的数据到另一个索引。 步骤4:删除旧的索引,并将应用程序中的查询指向新的索引。 步骤5:在代码中更新索引名称和类型。注意在6.x中,每个索引只有一个类型,因此类型名可以固定(比如都使用“_doc”),或者不使用(在7.0中类型将被移除)。 另外,引用[4]提到另一个可能导致启动失败的问题:节点锁问题。但用户的问题是关于更新映射时出现多个类型,所以重点解决多类型问题。 如果用户是在创建索引或更新映射时遇到此问题,应该确保在创建索引时只定义一个类型,并且在添加文档时使用相同的类型名(或者使用默认的“_doc”)。 示例:创建索引时定义映射(只包含一个类型,例如“_doc”) ``` PUT my_index { "mappings": { "_doc": { // 在6.x中,类型名可以指定,但只能有一个 "properties": { "field1": { "type": "text" } } } } } ``` 注意:从Elasticsearch 7.0开始,类型(type)已经被完全移除。在7.x中,每个索引只有一个默认类型“_doc”,并且不能自定义类型名。因此,在7.x中,文档的API中不再需要指定类型,而是直接使用索引名。 总结:用户需要将现有的多类型索引拆分为多个单类型索引,并调整应用程序的索引和查询逻辑。 相关问题: 1. 如何将Elasticsearch 5.x的多类型索引迁移到6.x? 2.Elasticsearch 6.x中如何设计索引以替代多类型? 3. Elasticsearch 7.x中类型被移除后,API调用有什么变化?</think>### Elasticsearch 映射更新因多类型导致的 IllegalArgumentException 解决方案 #### 问题原因 当您看到错误 `java.lang.IllegalArgumentException: Rejecting mapping update to [index] as the final mapping would have more than 1 type` 时,根本原因是 **Elasticsearch 6.0+ 版本强制实施的单类型策略**: 1. **版本限制**:从 Elasticsearch 6.0 开始,每个索引只允许存在一个映射类型(mapping type),7.0 版本已完全移除类型概念[^3] 2. **冲突场景**:当尝试向已有类型A的索引中添加类型B的文档时(如 `PUT index/_doc/1 { "type":"product" }` 后执行 `PUT index/_doc/2 { "type":"goods" }`) 3. **错误本质**:ES 拒绝创建包含多个类型的映射(如 `[product, goods]`)[^2] --- #### 解决方案 **方法1:重建索引(推荐)** ```bash # 1. 创建新索引(单类型) PUT new_index { "mappings": { "properties": { "product_field": { "type": "text" }, "goods_field": { "type": "keyword" } } } } # 2. 数据迁移(使用Reindex API) POST _reindex { "source": { "index": "old_index" }, "dest": { "index": "new_index" } } # 3. 别名切换(零停机) POST _aliases { "actions": [ { "add": { "index": "new_index", "alias": "current_index" } }, { "remove": { "index": "old_index", "alias": "current_index" } } ] } ``` **方法2:字段合并(简化模型)** ```json // 合并不同类型字段到统一结构 { "item_type": { "type": "keyword" }, // 标识类型 "common_field1": { "type": "text" }, "product_specific": { "type": "integer" }, "goods_specific": { "type": "boolean" } } ``` **方法3:多索引方案** ```bash # 为每种类型创建独立索引 PUT products_index PUT goods_index # 跨索引查询(使用索引通配符) GET products_index,goods_index/_search ``` --- #### 预防措施 1. **版本兼容**: - ES 5.x:允许最多1个类型(兼容模式) - ES 6.x:强制单类型(建议使用默认类型 `_doc`) - ES 7.x+:完全移除类型概念[^3] 2. **写入规范**: ```java // 错误示例(显式指定类型) IndexRequest request = new IndexRequest("index", "goods"); // 正确示例(7.x+) IndexRequest request = new IndexRequest("index"); ``` 3. **索引设计原则**: - 按数据生命周期划分索引(如按年分片 `logs-2023`) - 相同结构的文档放在同一索引 - 不同结构的文档使用独立索引+跨索引查询 --- #### 迁移注意事项 1. **检查现有索引**: ```bash GET _cat/indices?v&h=index,health,status,pri,rep,docs.count ``` 2. **识别多类型索引**: ```bash GET problem_index/_mapping ``` 3. **使用Elasticsearch迁移工具**: - Elasticsearch Reindex API - Logstash - Elasticdump > **关键提示**:从 ES 5.x 升级到 6.x+ 时,必须完成多类型索引的迁移工作,否则更新操作将触发此异常[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九师兄

你的鼓励是我做大写作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值