115 votes

Mettre à jour uniquement la valeur d'un champ spécifique dans Elasticsearch

Est-il possible de mettre à jour certaines valeurs de champs spécifiques dans Elasticsearch sans écraser les autres champs ?

93voto

Marc Points 1492

Dans ES 7.3, le nouveau format est :

POST /myindex/_update/mydocid
{
    "doc" : {
        "myfield": "nouvelle valeur de mon champ"
    }
}

90voto

pedrouan Points 256

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
   }
}

29voto

javanna Points 24751

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.

11voto

Sumit Sood Points 13

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)
        ]
      }
  }
}

10voto

Pramod Points 201

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X