允许使用mongoengine特定语法的查询代理,以使用AtlasSearch
项目描述
AtlasQ
AtlasQ允许使用AtlasSearch,同时保留MongoEngine的语法。
结构
该软件包试图遵循MongoEngine的结构;主要差异在于transform.py
和queryset.py
文件。
转换
与MongoEngine类似,管道中的一个步骤是从Q
对象创建查询:我们必须在MongoEngine的通用语法和AtlasSearch允许的语法之间找到对应关系。为此,我们不得不做一些妥协。
目前并非所有关键字都受支持:如果您有一个希望支持的实际情况,请随时在任一时刻打开问题或PR。
查询集
可能有一千种更好的实现方式,如果你真正了解MongoEngine,尤其是PyMongo。不幸的是,我们的知识有限,所以只能这样做。如果你找到了更好的解决方案,请随意提出问题或提交PR。
主要思想是,filter
应该像aggregation
一样工作。为了实现这一点,并保持与MongoEngine工作方式的兼容性(即,filter应该返回一个Document
查询集),我们不得不做一些工作。
调用.aggregate
必须按照MongoEngine的预期工作,即返回一个字典列表。
用法
现在最重要的部分:你该如何使用这个包?
from mongoengine import Document, fields
from atlasq import AtlasManager, AtlasQ, AtlasQuerySet
index_name = str("my_index")
class MyDocument(Document):
name = fields.StringField(required=True)
surname = fields.StringField(required=True)
atlas = AtlasManager(index_name)
obj = MyDocument.objects.create(name="value", surname="value2")
qs = MyDocument.atlas.filter(name="value")
assert isinstance(qs, AtlasQuerySet)
obj_from_atlas = qs.first()
assert obj == obj_from_atlas
obj2_from_atlas = MyDocument.atlas.get(AtlasQ(name="value") & AtlasQ(surname="value2"))
assert obj == obj2_from_atlas
obj3_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value"))
assert obj3_from_atlas is None
扩展功能
验证
我们还决定可选地验证索引。检查了以下两点:
- 索引实际上存在(如果你查询一个不存在的索引,Atlas作为默认行为不会引发任何错误)。
- 你正在查询的字段实际上是索引过的(如果你查询一个未索引的字段,Atlas作为默认行为不会引发任何错误,并将返回一个空列表)。要进行这些检查,你需要调用查询集上的
ensure_index
函数。
from mongoengine import Document, fields
from atlasq import AtlasManager, AtlasQ
index_name = str("my_index")
class MyDocument(Document):
name = fields.StringField(required=True)
surname = fields.StringField(required=True)
atlas = AtlasManager(index_name)
result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is True
obj1_from_atlas = MyDocument.atlas.get(AtlasQ(name="value"))
obj2_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value")) # raises AtlasIndexFieldError
内嵌文档
根据你如何创建你的搜索索引,内嵌文档以两种不同的方式进行查询。请确保索引,以便AtlasQ可以知道你的索引是如何定义的。如果你使用了embeddedDocuments类型,AtlasQ将使用embeddedDocument查询语法。否则,如果你使用了document类型,或者你没有确保索引,将使用正常的text
搜索和.
语法。
上传索引
可以使用AtlasQ直接上传搜索索引,在查询集上调用upload_index
函数。对索引本身的语法检查将执行。如果不存在_id
但指定了pk
或id
,它将被自动添加,允许在主键上进行有效的文本查询。
from mongoengine import Document, fields
from atlasq import AtlasManager
index_name = str("my_index")
index = {
"analyzer": "lucene.keyword",
"mappings": {
"dynamic": False,
"fields": {
"_id": {
"type": "objectId"
},
"name": {
"type": "string"
},
"surname": {
"type": "string"
},
}
}
}
class MyDocument(Document):
name = fields.StringField(required=True)
surname = fields.StringField(required=True)
atlas = AtlasManager(index_name)
result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is False
MyDocument.atlas.upload_index(index, "user", "pwd", "group", "cluster")
result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is True
项目详情
下载文件
下载适用于你的平台的文件。如果你不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
散列值 for atlasq_tschaume-0.11.1.dev2-py3-none-any.whl
算法 | 散列摘要 | |
---|---|---|
SHA256 | f38813972c8c379964f09200fa89f9ae909ccbf5b3483bb6a77d5bf34720dde0 |
|
MD5 | b6f2b6d97bfa5fa548043fc5de24533e |
|
BLAKE2b-256 | a58c83b96f52f5a5b8e418bf4cbf9089cfbea33fc0b809c28fd5a9b9393b67ba |