I've been working with Elasticsearch for some days. As i'm creating a CRUD, I've come across the updateByQuery method. I'm working with nestjs, and the way that I'm updating a field is:
await this.elasticSearch.updateByQuery(
{
index: 'my_index_user',
body:{
query:{
match:{
name: 'user_name',
}
},
script: {
inline : 'ctx._source.name = "new_user_name"'
}
}
}
);
My question is:
Why does elasticsearch need this syntax 'ctx._source.name = "new_user_name"'
to specifie what the new value of the field name should be? What is ctx._source is this context?
As mentioned in the official doc of source filtering, using this you can fetch field value in the
_source
(Value which sent to Elasticsearch and this is stored as it is, and doesn't go through the analysis process).Let's take an example of
text
field for whichstandard
analyzer(Default) is applied, and you store the value offoo bar
in this field, Elasticsearch breaks the value of field as it goes through the analysis process andfoo
andbar
two tokens are stored in the inverted index of Elasticsearch, but if you want to see the original value iefoo bar
, you can check the_source
and get it.Hence, it's always better to have the original value(without analysis process) to be in the
_source
, hence using this API, you are updating the field value there.. this also helps when you want to reindex later to new index or change the way its analyzed as you have the original value in _source.