ElasticSearch创建索引报错

博客记录了使用curl向ES发送PUT请求时遇到报错,错误信息为不支持'application/x-www-form-urlencoded'的Content-Type头。解决办法是添加'Content-Type:application/json'头。原因是ES在6.x后做了调整,可查看官网获取具体信息。

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

当执行

curl -X PUT '9.112.4.34:9200/accounts/person/1' -d '
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}'

报错:{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406} 

curl -H 'Content-Type:application/json' -X PUT '9.112.4.34:9200/accounts/person/1' -d '
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}'

是由于ES在6.x后做了调整,具体信息查看官网:https://www.elastic.co/blog/strict-content-type-checking-for-elasticsearch-rest-requests

这个错误通常出现在 Elasticsearch 的版本更新过程中,因为从 7.x 版本开始,默认情况下不再支持显式指定类型名称(即 `_doc`)。如果你尝试在未设置 `include_type_name=true` 参数的情况下向 Elasticsearch 发送包含类型的映射请求,则会遇到此问题。 ### 解决方案 #### 方法一:禁用类型名 最简单的方式是在构建 JSON 映射时不包括文档类型部分,直接针对索引本身操作即可。例如: ```json PUT /my_index { "mappings": { // 直接在这里定义字段属性等信息 "properties": { "field1": { "type": "text" } } } } ``` 可以看到我们去掉了原来的 `_doc` 层级结构,而将所有内容放置到根节点下的 mappings 中。 --- #### 方法二:启用 include_type_name 参数 如果确实需要保留旧版风格的 API 调用形式,在 URL 后添加查询字符串参数 `?include_type_name=true` 可以解决该问题。比如通过 Kibana Console 或 curl 命令行工具发送 HTTP 请求时像下面这样做: ```bash curl -X PUT "http://localhost:9200/my_index?include_type_name=true" -H 'Content-Type: application/json' -d' { "mappings": { "_doc": { "properties": { "field1": {"type": "keyword"} } } } }' ``` 注意这种方法仅作为临时过渡措施,并非推荐做法,未来更高级别的兼容可能会移除此类选项。 --- #### 方法三:降级至低版本Elasticsearch (不建议) 最后一种选择就是考虑回退使用较低版本的 Elasticsearch (如6.x系列),在那里依然允许自由地自定义各种数据类型及关联关系配置文件格式。但是这并不是一个长久之计,毕竟软件都会朝着更好的方向发展迭代升级,长期看还是应该适配新的标准规范较好!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值