📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 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 deprecatedcopy_toMapperParsingException 等关键字通常会一起出现。

常见日志形态通常类似下面这样:

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. 如何排查和解决这个异常和解决这个异常 #

建议按“先复现、再定位、后修复”的顺序处理:

  1. 搜索索引模板、组件模板和 mapping 生成代码里所有 include_in_all 出现的位置。
  2. 确认报错字段是否位于 fields 子字段内部,如果是,这是直接不允许的用法。
  3. 检查索引创建版本,若索引创建于 6.0 及以后,即使不在 multi-fields 中也不应继续使用该参数。
  4. 对照业务需求,确认原本想通过 _all 达成的是“统一检索”还是“多个字段合并搜索”。
  5. 在测试环境验证去掉 include_in_all 或改用 copy_to 后,模板是否能正常通过。

排查时需要注意的问题 #

  • 这是模板和 mapping 设计问题,重试不会让它自动恢复。
  • 如果错误模板被用于 rollover 或自动建索引,问题会持续影响后续新索引创建。
  • 在 6.x+ 环境里继续保留 _all 思路,会反复碰到同类兼容问题。

4. 如何解决这个错误 #

常用修复思路 #

  • 删除 include_in_all 配置,尤其是 multi-fields 下的声明。
  • 如果业务需要“总字段”检索能力,改用 copy_to 把多个字段汇总到自定义字段。
  • 修复历史模板和自动生成脚本,避免后续新索引继续带入旧配置。
  • 对已经创建失败的索引流程重新执行验证,确认模板发布后能恢复自动建索引。

后续注意事项与推荐建议 #

  • 升级 Elasticsearch 前,建议先做一次模板兼容性扫描,清理 _allinclude_in_all 等历史配置。
  • 用统一模板生成链路替代手工复制 mapping,减少旧参数残留。
  • 对全文检索需求优先显式设计 copy_to 字段,而不是依赖已废弃特性。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 适合查看集群健康度、节点指标、索引状态、错误趋势和请求画像,帮助快速判断异常是局部问题还是系统性问题。
  • INFINI Gateway 适合部署在 Elasticsearch 前面做请求观测、限流、熔断、缓存和流量治理,尤其适合定位高频错误请求、异常重试和不合理 DSL。
  • 如果需要长期治理,建议把异常日志、慢查询、调用来源和变更记录统一接入监控面板,缩短从“发现问题”到“定位根因”的时间。

5. 小结 #

多字段中不允许使用include_in_all 的核心不是查询故障,而是旧版 mapping 习惯和新版本索引规则冲突。把 include_in_all 清理掉,并用 copy_to 替代需要的聚合检索字段,通常就是正确修复路径。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

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.");