-
Notifications
You must be signed in to change notification settings - Fork 0
Declarative mapping
Declarative mapping will allow users to define their Elasticsearch document type mappings in a way that's Pythonic and easy to read.
Work is currently being done in the branch: https://github.com/robhudson/elasticutils/compare/declarative-mapping
Here is an example of what a Book document type might look like using various fields:
class BookDocumentType(DocumentType):
id = fields.IntegerField(type='long')
name = fields.StringField(analyzer='snowball')
name_sort = fields.StringField(index='not_analyzed')
authors = fields.StringField(is_multivalued=True)
published_date = fields.DateField()
price = fields.DecimalField()
is_autographed = fields.BooleanField()
sales = fields.IntegerField()
The various Field
types map to Elasticsearch field types. The DocumentType
base class and the various Field
classes will be able to generate the JSON representation of the mapping itself. So, for example, calling BookDocumentType().get_mapping()
would produce the following JSON that can be passed to Elasticsearch:
{
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "string",
"analyzer": "snowball"
},
"name_sort": {
"index": "not_analyzed",
"type": "string"
},
"authors": {
"type": "string"
},
"published_date": {
"type": "date"
},
"price": {
"type": "string"
},
"is_autographed": {
"type": "boolean"
},
"sales": {
"type": "integer"
}
}
}
- Support the object type
- Start thinking about other Elasticsearch features (parent/child, nested docs, etc)
- Consider attaching some of the things that are currently on
Indexable
andMappingType
to this.
The object type could be treated as a related mapping type complete with its own fields, but included in the main mapping type. For example:
class BookDocumentType(DocumentType):
id = IntegerField(type='long')
title = StringField(analyzer='snowball')
authors = ObjectField(class=AuthorDocumentType, is_multivalued=True)
class AuthorDocumentType(DocumentType):
first_name = StringField(analyzer='snowball')
last_name = StringField(analyzer='snowball')
While scanning to produce the mapping we would find the ObjectField
, see the class and nest the defined class in the properties using "type": "object"
.
It's possible we should subclass ObjectType
rather than DocumentType
to make it clearer and attach any special handling code for this class.