Est-il possible de mettre à jour des valeurs de champs spécifiques dans elasticsearch sans écraser d’autres champs? ?
Oui, Elasticsearch prend en charge les mises à jour partielles. Cela signifie que vous pouvez soumettre:
Jetez un coup d'oeil au update api . 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é, que les modifications lui sont appliquées et que le nouveau document est remplacé. En fin de compte, il s’agit en réalité d’une réécriture complète du document, mais vous n’avez pas à soumettre le document dans son intégralité, sauf si vous avez désactivé le champ _source , activé par défaut, qui permet vous devez récupérer le document entier afin de lui appliquer les modifications.
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 propriété yourProperty
uniquement .
En conséquence, cette réponse apparaît:
{
"_index": "index",
"_type": "type",
"_id": "100100471",
"_version": 1,
"_shards": {
"total": 0,
"successful": 1,
"failed": 0
}
}
Si vous souhaitez uniquement mettre à jour la valeur de champ existante, 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 (Replace with Document ID)
]
}
}
}
Si vous souhaitez ajouter un nouveau champ avec de la 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 (Replace with Document ID)
]
}
}
}