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

适用版本: 6.8-7.15

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

unknown key for a token in [...] 表示 Elasticsearch 在解析某个对象字段时,读到了当前 token,但这个 token 所在位置不允许出现对应的键或值结构。

从当前页面保留的源码看,它常见于按 token 类型分支解析的配置对象中。示例片段里 parser 只接受少量已知字段,例如 scriptignore_failure;如果在某个 token 分支下出现了不支持的键,就会直接抛出这个异常。

典型报错 #

ParsingException: Unknown key for a VALUE_STRING in [field_name]

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

  • 配置键拼写错误:如将 ignore_failure 拼写错误。
  • 版本不兼容:使用了较新版本特有的配置键。
  • 多余的配置项:处理器配置中包含了不被支持的字段。
  • 处理器类型错误:配置键与该处理器类型不匹配。

3. 排查步骤 #

  1. 检查处理器配置:确认处理器 JSON 结构符合规范。
  2. 核对配置键:确认所有键名拼写正确且在支持列表中。
  3. 查阅版本文档:确认配置键在当前版本中受支持。
  4. 简化配置:使用最小处理器配置逐步验证。

4. 修复建议 #

方案一:修正配置键 #

确保使用正确的配置键名:

// 错误示例
{
  "processors": [
    {
      "set": {
        "field": "my_field",
        "invalid_key": "value"
      }
    }
  ]
}

// 正确示例
{
  "processors": [
    {
      "set": {
        "field": "my_field",
        "value": "my_value",
        "ignore_failure": true
      }
    }
  ]
}

方案二:移除无效配置 #

删除不被当前版本支持的配置项。

方案三:升级版本 #

如果需要使用新特性,升级 Elasticsearch 版本。

5. 小结 #

unknown key for a token in [...] 的核心不是“功能不可用”,而是 当前 token 分支下出现了不该出现的键或结构。优先检查对象里的字段集合和 JSON 层级。

相关错误 #

附:日志上下文 #

if (SCRIPT_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
    script = Script.parse(parser);
} else if (IGNORE_FAILURE_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
    ignoreFailure = parser.booleanValue();
} else {
    throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName
        + "].", parser.getTokenLocation());
}
} else if (token == XContentParser.Token.START_OBJECT) {
    if (SCRIPT_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
        script = Script.parse(parser);