2016-11-07 6 views
0

Я пытаюсь использовать Elasticsearch-dsl-py для индексации некоторых данных из jsonl-файла со многими полями. игнорируя менее общие части, код выглядит следующим образом:define parent in 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) 

пытается запустить это заканчивается с ошибкой:

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

Я думаю, мне нужно сказать эс заранее, что имеет родитель. Однако я не хочу отображать ВСЕ поля как для этого.

Любая помощь очень приветствуется!

ответ

0

При создании mydocs индекса в определении вашего childx типа отображения, необходимо указать _parent поле со значением fatherdoc:

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

я могу это сделать без перечисления всех полей - просто " _parent? – Ori5678

+0

Вам нужно сделать это во время создания индекса, что означает, когда вы определяете свое сопоставление. Вы можете определенно позволить ES динамически создавать свои поля на ходу, но поле '_parent' должно быть указано в самом начале перед индексированием первого документа. – Val

+0

Любая удача с этим? – Val