Reputation: 524
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
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
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