0

Googleエンジンでは、次のクエリを使用して、指定された名を持つすべてのユーザーを見つけます。

「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 に答える