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 在分析过程中打破字段的值,foobar两个标记存储在Elasticsearch的倒排索引中,但是如果你想看到原始值即foo bar ,你可以检查_source并得到它。

因此,将原始值(没有分析过程)放在 _source 中总是更好,因此使用此 API,您正在更新那里的字段值.. 这也有助于稍后重新索引到新索引或更改其分析方式,因为您在 _source.

中拥有原始值