2016-04-12 45 views
11

Cerco di indicizzare alcuni documenti nidificati in una mappatura Elasticsearch (v2.3.1) che appare come segue (based on this example from the documentation):Tipo annidato in Elasticsearch: "il mapping dell'oggetto non può essere modificato da nidificato a non annidato" durante l'indicizzazione di un documento

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

Tuttavia, non capisco come devono essere i miei documenti JSON per adattarsi a tale mappatura. Ho provato con

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

così come con

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

che sia risultato in

{ 

    "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 

} 

Quale è il formato corretto di indicizzare i documenti annidati? Tutti gli esempi di lavoro sono molto apprezzati, molti esempi qui su SO o su altre pagine si concentrano su query annidate piuttosto che su come i documenti sono stati indicizzati in precedenza.

+2

Si sta utilizzando il tipo 'blogpost' mappatura nel tuo URL o no? Non è chiaro dalla tua domanda (ad esempio 'some_type' vs' blogpost'). Sembra che tu stia davvero creando un documento di tipo 'some_type' e' comments' si imposterà su un oggetto normale, il che non è permesso dato che hai già un oggetto annidato chiamato 'comments' nel tipo di mapping' blogpost'. – Val

+0

Ahh no, sul serio ... questo è quello che succede quando copi e incolli troppo da fonti diverse. Se vuoi aggiungere questo come risposta, sarò felice di accettarlo in modo da avere un altro esempio completo in giro. – Dirk

risposta

8

Sembra siete veramente la creazione di un documento di tipo some_type e comments si imposterà a un normale object (cioè non nested), che non è consentito in quanto si dispone già di un oggetto nidificato chiamato comments nel tipo blogpost mapping nel stesso indice.

Prova a modificare e dovrebbe funzionare:

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

Come è questa una risposta? È esattamente come l'esempio che non funziona (ad eccezione del cambiamento del tipo). Ho questo problema, sto usando il tipo corretto, e continuo a ricevere lo stesso errore. – Gullbyrd

+2

@Gullbyrd guarda più attentamente il nome del tipo (suggerimento: 'blogpost' invece di' some_type') ;-) Ti suggerisco di creare una nuova domanda facendo riferimento a questo ma spiegando il tuo contesto e i dettagli e saremo in grado di capirlo su. – Val