0

在谷歌引擎中,我有以下查询来找到给定名字的所有用户。

当我输入“Mi”时,它会列出数据库中的所有“Michael”和“Mike”。

class User(UserMixin, ndb.Model):
    firstname = ndb.StringProperty()


 data = User.query(ndb.AND(User.firstname >= name_startsWith, User.firstname <= name_startsWith + u'\ufffd')).fetch(5)

我想让它保持不变,以便我可以输入“mi”并且它仍然输出相同的名称。

我在 Python 中尝试过lower(),但这不适用于应用引擎StringProperty()

 data = User.query(ndb.AND(User.firstname.lower() >= name_startsWith.lower(), User.firstname.lower() <= name_startsWith.lower() + u'\ufffd')).fetch(5)

它抛出错误:

AttributeError: 'StringProperty' 对象没有属性 'lower'

4

3 回答 3

2

您可以使用计算属性:

class User(UserMixin, ndb.Model):
    firstname = ndb.StringProperty()
    name_lower = ndb.ComputedProperty(lambda self: self.firstname.lower())

https://developers.google.com/appengine/docs/python/ndb/properties#computed

然后使用从您的查询返回的名字(将有正确的大小写)。

于 2013-08-13T15:33:10.643 回答
2

您不能使用数据存储 API 进行类似的搜索。您可以存储该字段的附加小写版本,或使用专为此类事情设计的全文搜索 API。

于 2013-08-13T14:00:47.007 回答
0

存储您希望能够以这种方式搜索的任何字符串的规范化版本。App Engine 中的查询只能对索引中的实际内容进行简单的过滤。

尝试这样的事情

class User(ndb.Model):
    firstname = ndb.StringProperty()
    firstname_norm = ndb.StringProperty()

username = "Some Name"
User(firstname = username, firstname_norm = normalizer(username)).put()

data = User.query(ndb.AND(User.firstname_norm >= normalizer(name_startsWith), User.firstname_norm <= normalizer(name_startsWith) + u'\ufffd')).fetch(5)

其中“normalizer()”是一个functStore,是您希望能够以这种方式搜索的任何字符串的规范化版本。App Engine 中的查询只能对 index.ion 中的实际内容进行简单过滤,将混合大小写的字符串转换为全小写形式,然后在构造查询时使用相同的函数。这可以像调用字符串的 .lower() 方法一样简单,也可以像删除所有标点符号、将所有空格转换为单个空格、执行 unicode 规范化等复杂,具体取决于您的需要。

def normalizer(x):
    return x.lower()
于 2013-08-13T14:08:54.687 回答