Elasticsearch6无类型索引特定HTTP方法配置及单条数据写入问题咨询
解决Elasticsearch 6中无类型索引的HTTP写入问题
你遇到的问题其实是ES6.x版本在类型(type)过渡阶段的典型限制——从ES6开始,官方已经在逐步废弃索引的类型概念,每个索引只能有一个类型,而且默认情况下,你必须明确指定这个类型才能用普通HTTP方法写入数据,这也是为什么你的Bulk API能正常工作(因为Bulk请求里你肯定指定了类型),但单独的POST/PUT会失败。
下面给你几个具体的解决办法:
1. 写入时明确使用默认类型_doc
这是最稳妥且符合ES官方过渡方案的做法。ES6推荐用_doc作为唯一的类型名,这样后续升级到ES7+(彻底移除类型)也不会有兼容性问题。
比如你之前可能尝试的错误写法:
POST /user_index/ { "name": "John", "age": 30 }
改成带_doc的正确写法:
POST /user_index/_doc/ { "name": "John", "age": 30 }
如果是指定ID的更新/写入请求:
PUT /user_index/_doc/1001 { "name": "John", "age": 31 }
2. 创建索引时配置单类型模式
如果你想提前适配无类型的使用习惯,可以在创建索引时设置index.mapping.single_type: true,强制该索引只能有一个类型(也就是_doc)。创建索引的请求示例:
PUT /user_index { "settings": { "index.mapping.single_type": true }, "mappings": { "_doc": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" } } } } }
配置后,你依然需要用_doc来写入数据,但这个设置能避免你不小心创建多个类型,同时让索引结构更贴近ES7+的无类型模式。
3. 检查Bulk请求的成功原因
你的Bulk API能正常写入,大概率是因为在Bulk的操作元数据里明确指定了_type: "_doc",比如:
POST /_bulk { "index": { "_index": "user_index", "_type": "_doc" } } { "name": "Alice", "age": 28 } { "index": { "_index": "user_index", "_type": "_doc" } } { "name": "Bob", "age": 35 }
这也是为什么Bulk能绕过类型限制的原因——它明确告诉了ES要使用的类型。
额外提醒
ES6.x还没完全移除类型,所以不要尝试完全省略类型来写入数据,这会触发ES的校验错误。遵循官方的过渡方案,统一用_doc作为类型名,既能解决当前的写入问题,也能为后续升级ES版本做好准备。
内容的提问来源于stack exchange,提问作者slipperypete
相关产品推荐
相关产品推荐

