如何在Google App Engine中实现类似Django的'contains'过滤查询?
有没有办法在Google App Engine上实现像Django中的contains或icontains这样的过滤器呢?我正在使用app engine的补丁。
我之前用过下面的查询来匹配字符串的开头,但现在的需求是要在Datastore中查找字符串模式。
Employee.all().filter('name >=',value).filter('name <',unicode(value) + u'\ufffd')
基本上,需求是实现一个搜索功能,结果是所有包含搜索字符串的字符串。
请给点建议。
提前谢谢你。
4 个回答
0
最近我遇到了同样的问题,于是我自己做了一个模型管理器,并重写了过滤功能,让它也能理解 __contains。我猜你是在用Django。
class UserFeedManager(models.Manager):
def filter(self, *args, **kwargs):
keywordargs = {}
for (arg, val) in kwargs.items():
if '__contains' in arg:
contains.append((arg.split('__')[0], val))
else:
keywordargs[arg] = val
result = []
if len(contains) > 0:
for entry in super(UserFeedManager, self).filter(*args, **keywordargs):
if all(map(lambda (attr, val): val in entry.__getattribute__(attr),
contains)):
result.append(entry)
else:
result = super(UserFeedManager, self).filter(*args, **keywordargs)
return result
基本上,它会先列出所有带有 __contains 的参数,然后获取所有结果,再把这些结果过滤,只保留符合所有条件的部分。
0
不,真正的子字符串搜索在这个数据存储中是做不到的。
你能做的最好的办法是添加一个关键词索引,然后根据你的问题进行那种“以...开头”的查询。不过,即便如此,对于像“foo bar baz”这样的内容,你可以在搜索“ba”时找到匹配,但搜索“ar b”就找不到了。
这听起来非常适合使用BigQuery,目前它还在预览阶段,需要排队才能获得访问权限。
4
你需要做的是创建一个字符串列表属性,里面包含不同的字符串组合,然后在这个列表上进行查询。
可以看看 appengine.ext.search.SearchableModel,里面有一个示例实现。你也可以查看一下 nonrel-search。