2019 年使用 Elasticsearch 7 时,旧教程的类型名路径引发过两个错误。它们都与 mapping type 过渡有关,但发生在不同接口,不能统一靠“再补一个参数”处理。
更新 mapping 时拒绝类型名
ES 7.3 中的一次更新请求提示:
Types cannot be provided in put mapping requests,
unless the include_type_name parameter is set to true.
当时使用带 product 类型的路径,加入 include_type_name=true 后继续按兼容方式处理。这个参数属于 ES 7 的过渡能力,不是后续版本的通用要求。
更清楚的方向是让路径和请求体一起使用 typeless 形式,例如在已存在的隔离测试索引中增加字段:
PUT /example_articles/_mapping
{
"properties": {
"category": { "type": "keyword" }
}
}
该请求会改 mapping,仅展示接口结构;不应拿它在生产索引随意试验。
写入时出现两个 type
另一次写入错误提示:
the final mapping would have more than 1 type: [_doc, article]
当时路径里还有自定义类型 article,与索引已有类型冲突。使用 typeless 文档接口时,路径中的 _doc 是接口名称的一部分,不是在同一索引中新建任意业务类型:
PUT /example_articles/_doc/1
{
"category": "article",
"title": "示例"
}
这会写入或替换指定 ID 的文档,因此只适合隔离示例。业务类别应通过普通字段或不同索引表达,不再靠给路径换一个类型名解决。
为什么不能只说“7.x 完全取消了 type”
7.x 是 API 废弃与兼容过渡阶段。索引创建版本、客户端和请求格式都影响迁移方式;共享底层同名字段的约束,也是移除多类型的重要背景。ES 7.3 Mapping types 迁移说明
迁移应覆盖建索引、模板、更新 mapping、写入和查询入口。修改 URL 后仍需核对请求体,不能混用 typed 与 typeless 层级。
最初更新还涉及 text 的 fielddata,但不应为了绕过错误就默认启用它。聚合或排序通常应先评估合适的 keyword 字段,单独考虑内存成本;类型迁移与字段建模是两件事。