适用版本: 6.8-6.8
1. 错误异常的基本描述 #
多字段中不允许使用include_in_all 表示 mapping 里在不被允许的位置继续声明了 include_in_all。从保留的源码可以看出,这里有两个明确限制:一是 multi-fields 中不能使用它,二是从 6.0 起新建索引整体上也不再支持它,因为 _all 已被废弃。
常见现象 #
- 创建索引、安装模板或更新 mapping 时立即返回
400。 - 报错会直接点名
include_in_all和具体字段名。 - 常见于老模板升级到 6.x/7.x 时,仍保留了
_all时代的配置习惯。
典型报错与异常栈 #
include_in_all in multi fields is not allowed、[_all] is deprecated、copy_to、MapperParsingException 等关键字通常会一起出现。
常见日志形态通常类似下面这样:
MapperParsingException: include_in_all in multi fields is not allowed. Found the include_in_all in field [title.raw]
MapperParsingException: [include_in_all] is not allowed for indices created on or after version 6.0.0 ... use [copy_to]
2. 为什么会发生这个错误 #
这个异常本质上是 mapping 仍在使用已经废弃的 _all 相关配置。早期版本里,include_in_all 用来控制字段是否进入 _all。但随着 _all 废弃,这个参数不仅不再推荐,在 multi-fields 和新版本索引中还会被直接拒绝。
常见原因通常包括:
- 旧版索引模板直接迁移到 6.x/7.x,没有清理
include_in_all。 - 从支持 multi-fields 的字段模板复制配置时,把
include_in_all一起复制进了子字段。 - 某些历史教程或生成器仍输出
_all时代的 mapping。 - 多环境模板不一致,导致只有部分集群在建索引时失败。
3. 如何排查和解决这个异常和解决这个异常 #
建议按“先复现、再定位、后修复”的顺序处理:
- 搜索索引模板、组件模板和 mapping 生成代码里所有
include_in_all出现的位置。 - 确认报错字段是否位于
fields子字段内部,如果是,这是直接不允许的用法。 - 检查索引创建版本,若索引创建于 6.0 及以后,即使不在 multi-fields 中也不应继续使用该参数。
- 对照业务需求,确认原本想通过
_all达成的是“统一检索”还是“多个字段合并搜索”。 - 在测试环境验证去掉
include_in_all或改用copy_to后,模板是否能正常通过。
排查时需要注意的问题 #
- 这是模板和 mapping 设计问题,重试不会让它自动恢复。
- 如果错误模板被用于 rollover 或自动建索引,问题会持续影响后续新索引创建。
- 在 6.x+ 环境里继续保留
_all思路,会反复碰到同类兼容问题。
4. 如何解决这个错误 #
常用修复思路 #
- 删除
include_in_all配置,尤其是 multi-fields 下的声明。 - 如果业务需要“总字段”检索能力,改用
copy_to把多个字段汇总到自定义字段。 - 修复历史模板和自动生成脚本,避免后续新索引继续带入旧配置。
- 对已经创建失败的索引流程重新执行验证,确认模板发布后能恢复自动建索引。
后续注意事项与推荐建议 #
- 升级 Elasticsearch 前,建议先做一次模板兼容性扫描,清理
_all、include_in_all等历史配置。 - 用统一模板生成链路替代手工复制 mapping,减少旧参数残留。
- 对全文检索需求优先显式设计
copy_to字段,而不是依赖已废弃特性。
借助 INFINI 产品提升排障效率 #
- INFINI Console 适合查看集群健康度、节点指标、索引状态、错误趋势和请求画像,帮助快速判断异常是局部问题还是系统性问题。
- INFINI Gateway 适合部署在 Elasticsearch 前面做请求观测、限流、熔断、缓存和流量治理,尤其适合定位高频错误请求、异常重试和不合理 DSL。
- 如果需要长期治理,建议把异常日志、慢查询、调用来源和变更记录统一接入监控面板,缩短从“发现问题”到“定位根因”的时间。
5. 小结 #
多字段中不允许使用include_in_all 的核心不是查询故障,而是旧版 mapping 习惯和新版本索引规则冲突。把 include_in_all 清理掉,并用 copy_to 替代需要的聚合检索字段,通常就是正确修复路径。
相关错误 #
- unknown-vector-index-options-type-type-for-field-fieldname:未知的向量索引选项类型
- unsupported-field-fieldname:不支持的字段名
- wrong-value-for-termvector-termvector-for-field-fieldname:termvector字段值错误
- unknown-property-fieldname:未知属性字段
- unknown-string-property-fieldname:未知字符串属性
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
name; builder.fieldType.typeName());
}
iterator.remove();
} else if (propName.equals("include_in_all")) {
if (parserContext.isWithinMultiField()) {
throw new MapperParsingException("include_in_all in multi fields is not allowed. Found the include_in_all in field ["
+ name + "] which is within a multi field.");
} else if (parserContext.indexVersionCreated().onOrAfter(Version.V_6_0_0_alpha1)) {
throw new MapperParsingException("[include_in_all] is not allowed for indices created on or after version 6.0.0 as " +
"[_all] is deprecated. As a replacement; you can use an [copy_to] on mapping fields to create your " +
"own catch all field.");





