elh*_*efe 1 field elasticsearch elasticsearch-5 elasticsearch-painless
ElasticSearch版本= 5.5
我继承了一些通过查询API更新将任意文档字段更新为任意值的代码,如下所示:
{
"query": ...
"script": {
"inline": "ctx._source." + field + " = " + value + ";"
}
}
Run Code Online (Sandbox Code Playgroud)
由于每分钟断路器的最大编译次数,这有时会导致查询失败。
一个部分更新将为这种情况下工作良好,但据我可以判断,部分更新标准更新API,而不是查询API提供的更新只支持:
{
"query": ...
"doc": {
field: value
}
}
Unknown key for a START_OBJECT in [doc]
Run Code Online (Sandbox Code Playgroud)
至少,作为ES newb,我认为这就是该错误的含义。在doc查询API文档的更新中也没有提及。
假设我是正确的,部分更新将不起作用,按照脚本指南中的建议对脚本进行参数化似乎是下一步,但似乎没有任何方法可以访问由参数指定的源字段:
# I wouldn't expect this to work, but tried anyway
{
"query": ...
"script": {
"inline": "ctx._source.params.field = value;",
"params": {
"field": field,
"value": value
}
}
}
"caused_by":{"type":"null_pointer_exception","reason":null}}
Run Code Online (Sandbox Code Playgroud)
尝试通过doc值访问该字段似乎也不起作用:
{
"query": ...
"script": {
"inline": "doc[params.field] = value;",
"params": {
"field": field,
"value": value
}
}
}
caused_by":{"type":"null_pointer_exception","reason":null}}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以修复此脚本,或者需要更广泛的重构?
但是,您几乎找到了正确的方法,如下所示:
{
"query": ...
"script": {
"inline": "ctx._source[params.field] = params.value;",
"params": {
"field": field,
"value": value
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
从ES 6开始,替换inline为source
| 归档时间: |
|
| 查看次数: |
1755 次 |
| 最近记录: |