web-dev-qa-db-fra.com

Type imbriqué dans Elasticsearch: "le mappage d'objet ne peut pas être changé de niché en non imbriqué" lors de l'indexation d'un document

J'essaie d'indexer certains documents imbriqués dans un mappage Elasticsearch (v2.3.1) qui ressemble à ceci (basé sur cet exemple de la documentation) :

PUT /my_index
{
  "mappings": {
    "blogpost": {
      "properties": {
        "title": { "type": "string" },
        "comments": {
          "type": "nested", 
          "properties": {
            "name":    { "type": "string"  },
            "comment": { "type": "string"  }
          }
        }
      }
    }
  }
}

Cependant, je ne comprends pas à quoi doivent ressembler mes documents JSON pour s'intégrer dans ce mappage. J'ai essayé avec

PUT /my_index/some_type/1
{
  "title": "some_title",
  "comments": {
    "name": "some_name",
    "comment": "some_comment"
  }
}

ainsi qu'avec

PUT /my_index_some_type/1
{
  "title": "some_title",
  "comments": [
      {
        "name": "some_name",
        "comment": "some_comment"
      }
  ]
}

qui se traduisent tous deux par

{

    "error": 

{

    "root_cause": 

[

            {
                "type": "remote_transport_exception",
                "reason": "[Caiman][172.18.0.4:9300][indices:data/write/index[p]]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "object mapping [comments] can't be changed from nested to non-nested"
    },
    "status": ​400

}

Quel est le format correct pour indexer les documents imbriqués? Tous les exemples de travail sont très appréciés, la plupart des exemples ici à SO ou sur d'autres pages se concentrent sur les requêtes imbriquées plutôt que sur la façon dont les documents ont été indexés auparavant.

19
Dirk

Il semble que vous créez vraiment un document de type some_type et comments prendront par défaut un object normal (c'est-à-dire pas nested), ce qui n'est pas autorisé car vous avez déjà un objet imbriqué appelé comments dans le type de mappage blogpost dans le même index.

Essayez ceci à la place et cela devrait fonctionner:

PUT /my_index/blogpost/1
{
  "title": "some_title",
  "comments": {
    "name": "some_name",
    "comment": "some_comment"
  }
}
18
Val