Renjith
Renjith

Reputation: 524

python elasticsearch-dsl parent child relationship

I started using the python library elasticsearch-dsl.

I am trying to implement a parent-child relationship but it is not working:

    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()

Upvotes: 8

Views: 2950

Answers (2)

Ori5678
Ori5678

Reputation: 499

OK, thanks all. The simple and messy solution that worked for me was to use:

from elasticsearch_dsl import Mapping

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

BEFORE creating the parent doc-type

Upvotes: 1

Kamil Sindi
Kamil Sindi

Reputation: 22832

elasticsearch-dsl has parent-child relationship built in using 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')

How to insert and query (HT to @Maresh):
- DSL get: ChildDoc.get(id=child_id, routing=parent_id)
- DSL insert: I believe it's child.save(id=child_id, routing=parent_id)
- Dictionary insert: specify '_parent': parent_id in dictionary

Upvotes: 11

Related Questions