6

これは簡単な質問のようです。しかし、ドキュメントはそれに答えていないようです。それらの例を使用して、これを行いたいです:

Account.query(Account.title == "best")

ただし、部分的な文字列も一致させたいと思います。したがって、このシナリオでは:

acct = Account(title="the best account in the world")

引数「best」を持つ ndb クエリは、acct.

現時点で私が目にする唯一のオプションは、ループして、それぞれをPythonのモジュールAccount.query()と一致させることです。これは良い解決策とは思えません。titlere.search

更新:私も見ていgqlます。これを行う:

acct = ndb.gql('SELECT * from Account WHERE title LIKE '%best%')

を返しますParse Error: Invalid WHERE Condition at symbol LIKE

4

3 に答える 3

11

注:これは質問に正確に答えるものではありませんが、探している人starts withはこの答えが役立つと思うかもしれません。

>=NDB の String フィールドは、大なり ( ) および小なり ( <) 検索を実行できる方法でインデックス化されます。Person次のモデルを想定しています。

class Person(ndb.Model):
    name         = ndb.StringProperty()
    name_lower   = ndb.ComputedProperty(lambda self: self.name.lower())

次のことができます。

def search_by_text(text):
  text = text.lower()
  limit = text[:-1] + chr(ord(text[-1]) + 1)
  return Person.query(Person.name_lower >= text, Person.name_lower < limit).fetch(50)

p = search_by_text('kri')

この例のlimit変数には文字列「krj」が含まれ、検索値の制限になります。kri上の例では、名前がそれより大きくて小さいすべての人が取得krjされ、最初の 50 件の調査結果に制限されます。制限があるため、krossやなどの名前larkは除外されます。

ndb.ComputedProperty注:検索するフィールドの小文字バージョンを含めることが重要です。それを追加することを忘れないでください!

于 2016-02-05T03:10:31.910 に答える
7

GQL にはワイルドカード マッチングがありません。そのためには、全文検索を使用する必要があります。

于 2013-01-12T09:25:59.347 に答える
3

タイトルのような(おそらく)短いフィールドの場合、タイトルの各単語を含む繰り返しStringPropertyを追加すると(おそらくストップワードを無視して)、単語を照合でき、検索APIを使用するよりも簡単になります。

于 2013-01-12T12:59:00.067 に答える