Est-il possible de mettre à jour certaines valeurs de champs spécifiques dans Elasticsearch sans écraser les autres champs ?
Réponses
Trop de publicités?En tant que contribution basée sur le code à cette réponse, la requête suivante peut être utilisée :
POST /index/type/100100471/_update
{
"doc" : {
"yourProperty" : 10000
}
}
Cette requête met à jour la yourProperty
propriété uniquement.
En conséquence, cette réponse apparaît :
{
"_index": "index",
"_type": "type",
"_id": "100100471",
"_version": 1,
"_shards": {
"total": 0,
"successful": 1,
"failed": 0
}
}
Oui, Elasticsearch prend en charge les mises à jour partielles. Cela signifie que vous pouvez soumettre :
- un document partiel, qui sera fusionné avec celui existant
- un script qui sera exécuté par-dessus le document existant
Jetez un œil à l'api de mise à jour. Dans les deux cas, ce qui se passe sous le capot, en raison du fonctionnement de la bibliothèque lucene sous-jacente, est que le document à mettre à jour est récupéré, les modifications y sont appliquées, et l'ancien document est écrasé par le nouveau. En fin de compte, il s'agit en fait d'une réécriture complète du document, mais vous n'êtes pas obligé de soumettre l'ensemble du document, sauf si vous avez désactivé le champ _source, activé par défaut, qui est le champ qui vous permet de récupérer l'ensemble du document afin d'y apporter des modifications.
Si vous souhaitez mettre à jour la valeur du champ existant uniquement, vous devez essayer cette solution:
POST IndexName/_update_by_query
{
"script": {
"source": """
if (ctx._source?.Field != null)
{
ctx._source.remove('Field');
ctx._source.put('Field', 'Value');
}
""",
"lang": "painless"
},
"query": {
"terms": {
"_id": [
1 (Remplacez par l'ID du document)
]
}
}
}
Si vous souhaitez ajouter un nouveau champ avec une valeur, vous devez essayer cette solution:
POST IndexName/_update_by_query
{
"script": {
"source": """
if (ctx._source?.NewField == null)
{
ctx._source.hf.put('NewField', 'Value');
}
""",
"lang": "painless"
},
"query": {
"terms": {
"_id": [
1 (Remplacez par l'ID du document)
]
}
}
}
Mise à jour Par l'API de Requête
Met à jour les documents qui correspondent à la requête spécifiée. Si aucune requête n'est spécifiée, effectue une mise à jour sur chaque document dans le flux de données ou l'index sans modifier la source, ce qui est utile pour prendre en compte les modifications de mapping.
POST http://localhost:9200/INDEX_NAME/_update_by_query
{
"script": {
"source": "ctx._source.userName=new_user_name",
"lang": "painless"
},
"query": {
"term": {
"userName": "old_user_name"
}
}
}
Dans l'exemple ci-dessus, la valeur du champ userName sera mise à jour en new_user_name
- Réponses précédentes
- Plus de réponses