2016-11-07 3 views
0

J'essaie d'utiliser Elasticsearch-dsl-py pour indexer certaines données d'un fichier jsonl avec beaucoup de champs. en ignorant les parties les moins générales, le code ressemble à ceci:define parent dans elasticsearch-dsl-py

es = Elasticsearch() 

for id,line in enumerate(open(jsonlfile)): 
    jline = json.loads(line) 
    children = jline.pop('allChildrenOfTypeX') 
    res = es.index(index="mydocs", doc_type='fatherdoc', id=id, body=jline) 
    for ch in children: 
    res = es.index(index="mydocs", doc_type='childx', parent=id, body=ch) 

essayant de courir cela se termine avec l'erreur:

RequestError: TransportError(400, u'illegal_argument_exception', u"Can't specify parent if no parent field has been configured") 

Je suppose que je dois dire es à l'avance qui a un parent. Cependant, ce que je ne veux pas, c'est de cartographier TOUS les champs des deux pour le faire.

Toute aide est la bienvenue!

Répondre

0

Lorsque vous créez votre index mydocs, dans la définition de votre type de cartographie childx, vous devez spécifier le champ _parent avec la valeur fatherdoc:

PUT mydocs 
{ 
    "mappings": { 
    "fatherdoc": { 
     "properties": { 
      ... parent type fields ... 
     } 
    }, 
    "childx": { 
     "_parent": {      <---- add this 
     "type": "fatherdoc" 
     }, 
     "properties": { 
      ... parent type fields ... 
     } 
    } 
    } 
} 
+0

puis-je faire sans énumérer tous les champs - juste le ' _parent'? – Ori5678

+0

Vous devez le faire au moment de la création de l'index, ce qui signifie que vous définissez votre mapping. Vous pouvez définitivement laisser ES créer dynamiquement vos champs en déplacement, mais le champ '_parent' doit être spécifié au tout début avant d'indexer le premier document. – Val

+0

Une chance avec ça? – Val