Select elasticsearch 中带参数的文档字段通过查询更新 API
Select document field with parameter in elasticsearch update by query API
ElasticSearch 版本 = 5.5
我继承了一些代码,通过 update by query API 将任意文档字段更新为任意值,如下所示:
{
"query": ...
"script": {
"inline": "ctx._source." + field + " = " + value + ";"
}
}
由于每分钟最大编译断路器,这有时会导致查询失败。
A partial update 适用于这种情况,但据我所知,部分更新仅在标准更新 API 中受支持,而不是查询更新 API:
{
"query": ...
"doc": {
field: value
}
}
Unknown key for a START_OBJECT in [doc]
至少,作为一个 ES 新手,我认为这就是那个错误的意思。在查询 API 文档的更新中也没有提到 doc
。
假设我是对的,部分更新将不起作用,下一步似乎是按照 scripting guide 中的建议对脚本进行参数化,但似乎没有任何方法可以访问源由参数指定的字段:
# 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}}
尝试通过 doc-values 访问该字段似乎也不起作用:
{
"query": ...
"script": {
"inline": "doc[params.field] = value;",
"params": {
"field": field,
"value": value
}
}
}
caused_by":{"type":"null_pointer_exception","reason":null}}
是否有任何方法可以修复此脚本或是否需要更广泛的重构?
你是对的,partial updates are not supported by the update-by-query API (+ here)。
不过,您几乎已经找到了正确的方法,它是这样的:
{
"query": ...
"script": {
"inline": "ctx._source[params.field] = params.value;",
"params": {
"field": field,
"value": value
}
}
}
更新:
从 ES 6 开始,将 inline
替换为 source
ElasticSearch 版本 = 5.5
我继承了一些代码,通过 update by query API 将任意文档字段更新为任意值,如下所示:
{
"query": ...
"script": {
"inline": "ctx._source." + field + " = " + value + ";"
}
}
由于每分钟最大编译断路器,这有时会导致查询失败。
A partial update 适用于这种情况,但据我所知,部分更新仅在标准更新 API 中受支持,而不是查询更新 API:
{
"query": ...
"doc": {
field: value
}
}
Unknown key for a START_OBJECT in [doc]
至少,作为一个 ES 新手,我认为这就是那个错误的意思。在查询 API 文档的更新中也没有提到 doc
。
假设我是对的,部分更新将不起作用,下一步似乎是按照 scripting guide 中的建议对脚本进行参数化,但似乎没有任何方法可以访问源由参数指定的字段:
# 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}}
尝试通过 doc-values 访问该字段似乎也不起作用:
{
"query": ...
"script": {
"inline": "doc[params.field] = value;",
"params": {
"field": field,
"value": value
}
}
}
caused_by":{"type":"null_pointer_exception","reason":null}}
是否有任何方法可以修复此脚本或是否需要更广泛的重构?
你是对的,partial updates are not supported by the update-by-query API (+ here)。
不过,您几乎已经找到了正确的方法,它是这样的:
{
"query": ...
"script": {
"inline": "ctx._source[params.field] = params.value;",
"params": {
"field": field,
"value": value
}
}
}
更新:
从 ES 6 开始,将 inline
替换为 source