git支持的json对象存储&弹性搜索
elastic-git的Python项目详细描述
在git支持的声明性object-y中冒险并使用 作为查询后端的ElasticSearch。
注意
这里有巨龙。
用法
fromelasticgitimportEGfromelasticgit.modelsimportModel,IntegerField,TextFieldworkspace=EG.workspace('/Users/sdehaan/Desktop/test-repo/')workspace.setup('Simon de Haan','simon@praekeltfoundation.org')""" # The model looks like this class Person(Model): age = IntegerField('The Age') name = TextField('The Name') """fromelasticgit.tests.baseimportTestPersonasPersonperson1=Person({'age':10,'name':'Foo'})workspace.save(person1,'Saving Person 1')person2=Person({'age':20,'name':'Bar'})workspace.save(person2,'Saving Person 2')person3=Person({'age':30,'name':'Baz'})workspace.save(person3,'Saving Person 3')
数据现在保存在git存储库中,并且可以通过elasticsearch进行查询:
>>>fromelasticgitimportEG>>>fromelasticgit.tests.baseimportTestPersonasPerson>>>workspace=EG.workspace('/Users/sdehaan/Desktop/test-repo/')>>>forpersoninworkspace.S(Person).filter(age__gte=20):...printperson.name,person.age...Bar20Baz30
检查examples/目录以获取更多代码示例。
$ python -m examples.basic_usage e6cb25f00870472fa5223d76dc361667 Baz 30 2bd470372243411c9abd8fdcb969dcf5 Bar 20
模式管理
在模式演化方面,我们遵循了apacheAvro的例子。 可以从命令行生成与avro兼容的模式。
模型定义可以从Avrojson模式文件重建。
示例模型文件:
classTestFallbackPerson(Model):age=IntegerField('The Age')name=TextField('The name',fallbacks=[SingleFieldFallback('nick'),SingleFieldFallback('obsolete'),])nick=TextField('The nickname',required=False)obsolete=TextField('Some obsolete field',required=False)
生成Avro规范文件
$ python -m elasticgit.tools dump-schema \
> elasticgit.tests.base.TestFallbackPerson > avro.json
$ python -m elasticgit.tools load-schema avro.json > models.py
生成的模型文件:
# NOTE:## This is an automatically generated Elasticgit Model definition# from an Avro schema. Do not manually edit this file unless you# absolutely know what you are doing.## timestamp: 2014-10-14T18:51:23.916194# namespace: elasticgit.tests.base# type: record# name: TestFallbackPerson#fromelasticgitimportmodelsclassTestFallbackPerson(models.Model):name=models.TextField(u"""The name""",fallbacks=[models.SingleFieldFallback('nick'),models.SingleFieldFallback('obsolete'),])age=models.IntegerField(u"""The Age""")obsolete=models.TextField(u"""Some obsolete field""")_version=models.ModelVersionField(u"""Model Version Identifier""")nick=models.TextField(u"""The nickname""")uuid=models.TextField(u"""Unique Identifier""")
我们正在使用ConfModel的回退功能并将其编码为Avro 架构为aliases。这让你可以回到以前的名字 字段:
>>>TestFallbackPerson({'obsolete':'oldest name','age':10}).name'oldest name'>>>TestFallbackPerson({'nick':'older name','age':10}).name'older name'>>>TestFallbackPerson({'name':'current name','age':10}).name'current name'