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

适用版本: 6.8-7.15

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

could not parse [TYPE] action [watchId/actionId]. unexpected number field [field] 表示 Watcher 在解析 action 时读取到了数值字段,但该字段在当前位置并不允许以数字形式出现。

从当前片段可以直接看出,在这段逻辑里只有 timeout 允许以数字方式被解析成毫秒值。其它数字字段都会被视为非法。

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

常见原因包括:

  • 把不支持数值类型的字段写成了纯数字。
  • 将原本应写成字符串的字段,如索引名、刷新策略、字段名,误写成数字。
  • 模板变量渲染后把字段替换成了数字,而不是解析器预期的字符串。

3. 如何排查和解决这个异常和解决这个异常 #

  1. 根据异常里的 [field] 找到出错字段。
  2. 查看当前 action 类型对该字段的格式要求,确认它是否真的允许数字。
  3. 如果字段本身应为文本值,检查模板变量或序列化代码是否把它转成了 number。
  4. 若本意就是超时时间,确认是否应使用 timeout,以及单位是否要通过字符串表达。

4. 如何解决这个错误 #

常用修复思路 #

  • 只有在 action 支持的情况下才使用数字字段。
  • 把误写成数字的字段改回字符串。
  • 给模板渲染和配置生成过程加上类型校验。

5. 小结 #

这个异常通常不是 Watcher 本身故障,而是 action 字段类型不匹配。按字段名回查配置,往往能很快找到问题点。

相关错误 #

附:日志上下文 #

}
} else if (token == XContentParser.Token.VALUE_NUMBER) {
    if (Field.TIMEOUT.match(currentFieldName, parser.getDeprecationHandler())) {
        timeout = timeValueMillis(parser.longValue());
    } else {
        throw new ElasticsearchParseException("could not parse [{}] action [{}/{}]. unexpected number field [{}]", TYPE,
            watchId, actionId, currentFieldName);
    }
} else if (token == XContentParser.Token.VALUE_STRING) {
    if (Field.DOC_TYPE.match(currentFieldName, parser.getDeprecationHandler())) {
        deprecationLogger.deprecate(DeprecationCategory.TYPES, "watcher_index_action", TYPES_DEPRECATION_MESSAGE);