web-dev-qa-db-fra.com

Mise à jour d'un champ avec un tableau imbriqué dans Elastic Search

J'essaie de mettre à jour un champ dans un document avec un tableau. Je souhaite ajouter un tableau au champ "produits". J'ai essayé ceci:

POST /index/type/1/_update
{
    "doc" :{
       "products": [
         {
           "name": "A",
           "count": 1
         },
         {
           "name": "B",
           "count": 2
         },
         {
           "name": "c",
           "count": 3
         }
       ]
    }
}

voici la réponse d'erreur que j'obtiens lorsque j'essaie d'exécuter le code:

{
   "error": {
      "root_cause": [
         {
            "type": "mapper_parsing_exception",
            "reason": "failed to parse [products]"
         }
      ],
      "type": "mapper_parsing_exception",
      "reason": "failed to parse [products]",
      "caused_by": {
         "type": "illegal_state_exception",
         "reason": "Can't get text on a START_OBJECT at 1:2073"
      }
   },
   "status": 400
}

Quelqu'un sait ce que je fais mal?

14
user3407300

Le message "Impossible d'obtenir du texte sur un START_OBJECT" signifie qu'Elasticsearch attendait une entrée de type "chaîne" mais que vous essayez de donner un objet en entrée.

Si vous cochez Kibana, vous constaterez que le champ "produits" existe là et est défini comme une chaîne. Mais puisque vous entrez une liste de dictionnaires, le champ "produits" devrait avoir été défini depuis le début comme un objet (de préférence avec des champs dynamiques). Un exemple serait (voir l'exemple complet sur https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic.html )

    "products": { 
      "dynamic": true,
      "properties": {}
    }

Cependant, puisque vous avez déjà l'index, vous ne pouvez pas modifier le mappage, vous devez donc supprimer l'index, faire le mappage au préalable, puis faire la mise à jour.

19
mshabeeb