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

适用版本: 6.8-7.15

1. 错误异常的基本描述 #

unknown key for a 表示 Elasticsearch 在解析 Ingest Processor 配置中的数组字段时,遇到了无法识别的元素类型。

从源码可见,这个异常在 Ingest Processor 的数组解析路径中抛出,当数组元素类型与预期不符时触发。

典型报错 #

ParsingException: Unknown key for a VALUE_NUMBER in [includes]

2. 为什么会发生这个错误 #

  • 数组元素类型错误:数组中的元素类型与预期不符(如字符串数组中传了数字)。
  • 配置格式错误:数组字段的配置格式不正确。
  • 版本不兼容:使用了较新版本特有的配置选项。
  • 处理器类型错误:配置项与该处理器类型不匹配。

3. 排查步骤 #

  1. 检查数组元素类型:确认数组中所有元素的类型一致且正确。
  2. 核对处理器文档:查阅该处理器支持的配置选项。
  3. 简化配置:使用最小处理器配置逐步验证。
  4. 检查版本兼容性:确认配置选项在当前版本中受支持。

4. 修复建议 #

方案一:修正数组元素类型 #

确保数组元素类型正确:

// 错误示例
{
  "processors": [
    {
      "script": {
        "source": "ctx.field = value",
        "includes": [123, 456]
      }
    }
  ]
}

// 正确示例
{
  "processors": [
    {
      "script": {
        "source": "ctx.field = value",
        "includes": ["var1", "var2"]
      }
    }
  ]
}

方案二:移除无效配置 #

删除不被当前处理器支持的配置项。

方案三:使用正确的处理器 #

确认使用了正确的处理器类型。

5. 小结 #

unknown key for a 通常意味着 Ingest Processor 配置中的数组元素类型有误。排查时应优先检查数组元素的类型。

相关错误 #

附:日志上下文 #

List includesList = new ArrayList<>();
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
    if (token == XContentParser.Token.VALUE_STRING) {
        includesList.add(parser.text());
    } else {
        throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token
            + " in [" + currentFieldName + "].", parser.getTokenLocation());
    }
}
includes = includesList.toArray(new String[includesList.size()]);
} else if (EXCLUDES_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {