elasticsearch updateByQuery 语法是如何工作的
How elasticsearch updateByQuery syntax works
我已经使用 Elasticsearch 好几天了。在创建 CRUD 时,我遇到了 updateByQuery method。我正在使用 nestjs,我更新字段的方式是:
await this.elasticSearch.updateByQuery(
{
index: 'my_index_user',
body:{
query:{
match:{
name: 'user_name',
}
},
script: {
inline : 'ctx._source.name = "new_user_name"'
}
}
}
);
我的问题是:
为什么 elasticsearch 需要这种语法 'ctx._source.name = "new_user_name"'
来指定字段 name 的新值应该是什么?什么是 ctx._source 这个上下文是什么?
如 official doc of source filtering 中所述,使用它您可以获取 _source
中的字段值(发送到 Elasticsearch 的值按原样存储,不经过分析过程)。
我们以应用standard
分析器(默认)的text
字段为例,您将foo bar
的值存储在该字段中,Elasticsearch
在分析过程中打破字段的值,foo
和bar
两个标记存储在Elasticsearch的倒排索引中,但是如果你想看到原始值即foo bar
,你可以检查_source
并得到它。
因此,将原始值(没有分析过程)放在 _source
中总是更好,因此使用此 API,您正在更新那里的字段值.. 这也有助于稍后重新索引到新索引或更改其分析方式,因为您在 _source.
中拥有原始值
我已经使用 Elasticsearch 好几天了。在创建 CRUD 时,我遇到了 updateByQuery method。我正在使用 nestjs,我更新字段的方式是:
await this.elasticSearch.updateByQuery(
{
index: 'my_index_user',
body:{
query:{
match:{
name: 'user_name',
}
},
script: {
inline : 'ctx._source.name = "new_user_name"'
}
}
}
);
我的问题是:
为什么 elasticsearch 需要这种语法 'ctx._source.name = "new_user_name"'
来指定字段 name 的新值应该是什么?什么是 ctx._source 这个上下文是什么?
如 official doc of source filtering 中所述,使用它您可以获取 _source
中的字段值(发送到 Elasticsearch 的值按原样存储,不经过分析过程)。
我们以应用standard
分析器(默认)的text
字段为例,您将foo bar
的值存储在该字段中,Elasticsearch
在分析过程中打破字段的值,foo
和bar
两个标记存储在Elasticsearch的倒排索引中,但是如果你想看到原始值即foo bar
,你可以检查_source
并得到它。
因此,将原始值(没有分析过程)放在 _source
中总是更好,因此使用此 API,您正在更新那里的字段值.. 这也有助于稍后重新索引到新索引或更改其分析方式,因为您在 _source.