web-dev-qa-db-fra.com

Mettre à jour uniquement la valeur de champ spécifique dans elasticsearch

Est-il possible de mettre à jour des valeurs de champs spécifiques dans elasticsearch sans écraser d’autres champs? ? 

15
Johnsa Philip

Oui, Elasticsearch prend en charge les mises à jour partielles. Cela signifie que vous pouvez soumettre:

  • un document partiel, qui sera fusionné avec l'existant
  • un script qui sera exécuté sur le document existant

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.

18
javanna

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

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)
        ]
      }
  }
}
0
Sumit Sood