Elasticsearch 脚本报错要先判断阶段:请求还没解析成功,和脚本已开始运行却遇到类型错误,是两种不同问题。下面对应 ES 7.3 的两次使用记录。

file 参数无法解析:改用 source 或存储脚本 id

遇到:

[script] unknown field [file], parser not found

不能只换一个文件路径。ES 7.3 的脚本结构使用 source 提供内联代码,或使用 id 引用已经注册的存储脚本,变量通过 params 传入。ES 7.3 脚本用法

例如在隔离测试环境注册一个价格增量脚本:

POST /_scripts/example-add-price
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.price += params.delta"
  }
}

再对已有测试文档调用:

POST /example_products/_update/1
{
  "script": {
    "id": "example-add-price",
    "params": { "delta": 22 }
  }
}

前提是 price 已存在且为合适的数值。注册脚本会修改集群状态,更新请求会改文档;不能拿生产数据试错。重复提交增量更新还会再次累加,应结合业务设计并发和重试规则。

列表追加:不要把字符串加到列表上

另一次文档中的 tags 是列表,写成下面的表达式时报类型转换错误:

ctx._source.tags += params.new_tag
Cannot cast java.lang.String to java.util.ArrayList

对于确实存在的列表,追加一个元素应使用 add:

POST /example_products/_update/1
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.tags.add(params.tag)",
    "params": { "tag": "example" }
  }
}

add 不会自动去重;重复请求也可能重复添加。若字段缺失、为 null 或历史值是字符串,应先明确初始化或数据清理策略,不要在一个脚本里静默猜测数据含义。ES 7.3 Update API

先确认输入,再改表达式

读取目标文档的脱敏 _source,核对脚本实际看到的值。mapping 的字段类型并不等于所有文档的 JSON 容器形态一致,也不能代替检查历史数据。

把请求结构、字段类型和业务操作分开,才能判断应该改 API 写法、修复文档,还是改变更新逻辑。不应根据一条旧记录推断所有 5.x 与 7.x 版本的兼容行为。