Отношения между родительскими и дочерними элементами python elasticsearch-dsl

Я начал использовать библиотеку python elasticsearch-dsl.

Я пытаюсь реализовать родительско-дочерние отношения, но это не работает:

    class Location(DocType):
        name = String(analyzer='snowball', fields={'raw': String(index='not_analyzed')})
        latitude = String(analyzer='snowball')
        longitude = String(analyzer='snowball')
        created_at = Date()

   class Building(DocType):
       parent = Location()

person Renjith    schedule 28.01.2016    source источник
comment
Пример кода? Актуальная проблема?   -  person scooter me fecit    schedule 28.01.2016
comment
@ScottM обновил образец кода   -  person Renjith    schedule 29.01.2016
comment
Существует множество различных вариантов реализации объектных отношений в смысле реляционной базы данных. Вы можете решить встроить документы в документы (в основном, вложенную таблицу в таблицу, если хотите). Или переопределить примитив соединения реляционной базы данных. Помогло бы, если бы вы объяснили подходы, которые вы рассматриваете, возникшие технические проблемы и т. Д. Ваш вопрос слишком широк, чтобы кто-либо мог дать вам конкретный ответ.   -  person scooter me fecit    schedule 01.02.2016


Ответы (2)


В elasticsearch-dsl отношения родитель-потомок построены с использованием MetaField < / а>:

class Location(DocType):
    name = String(analyzer='snowball', fields={'raw': String(index='not_analyzed')})
    latitude = String(analyzer='snowball')
    longitude = String(analyzer='snowball')
    created = Date()

    class Meta:
        doc_type = 'location' 

class Building(DocType):

    class Meta:
        doc_type = 'building'
        parent = MetaField(type='location')

Как вставить и запросить (HT to @Maresh):
- DSL get: ChildDoc.get(id=child_id, routing=parent_id)
- DSL insert: я считаю, что это child.save(id=child_id, routing=parent_id)
- Dictionary insert: укажите '_parent': parent_id в словаре

person Kamil Sindi    schedule 14.03.2016
comment
Вы случайно не знаете, как проверить parent_id при сохранении дочернего элемента, я с этим борюсь. - person Maresh; 29.03.2016
comment
@Maresh для вставки вы указываете ключ _parent в словаре. Для поиска делаешь MyDoc.get(id=doc_id, routing=parent_id). - person Kamil Sindi; 29.03.2016
comment
Итак, когда я сохраняю ребенка, do: child.save (parent = parent.meta.id)? Спасибо чувак. Отредактируйте свой ответ, это очень полезно, и в документе об этом ничего не говорится. - person Maresh; 29.03.2016
comment
@Maresh Я думаю, это child.save(id=child_id, routing=parent_id). Вы можете проверить? - person Kamil Sindi; 29.03.2016
comment
Подтвержденный. Большое спасибо. - person Maresh; 29.03.2016
comment
@Maresh Как заставить родителей получить ребенка? Как выглядит поисковый запрос? - person user805981; 31.03.2016
comment
Хм, я не совсем уверен, я использую ES в качестве хранилища документов для этого. Но у вас будет _parent с метаданными, я думаю, в документе ES есть несколько примеров. - person Maresh; 31.03.2016
comment
Когда вы говорите «хранилище документов» ... вы имеете в виду, что обрабатываете хранилище документов как реляционную базу данных с внешним ключом, который в основном равен routing? - person user805981; 31.03.2016
comment
Как мы можем сформировать дочерний запрос с помощью Elasticsearch DSL в Python - person devanathan; 05.10.2016
comment
ОБНОВЛЕНИЕ: больше не работает в ElasticSearch 6. Вместо этого необходимо использовать поле Join. - person andy; 19.01.2018

ОК, спасибо всем. Простое и беспорядочное решение, которое сработало для меня, заключалось в использовании:

from elasticsearch_dsl import Mapping

mcc = Mapping(typeChild)
mcc.meta('_parent', type=typeParent)
mcc.field(fieldName, 'string', fielddata=True, store=True)
mcc.save(index)

ПЕРЕД созданием родительского типа документа

person Ori5678    schedule 27.11.2016