2013-01-12 28 views
5

これは簡単な質問であるようです。しかし、the docsはそれに答えるようではありません。これらの例を使用して、私はこれをしたい:ndbクエリ部分文字列一致

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

私は部分文字列にも一致したい。したがって、このシナリオで:

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

引数を持つNDBクエリは、「最高の」acctと一致します。

私が目にする唯一の選択肢は、Account.query()をループし、それぞれtitlere.searchのモジュールをpythonでマッチさせることです。これは良い解決策のようには見えません。

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

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

Parse Error: Invalid WHERE Condition at symbol LIKE

+0

GQLはSQLではありません。 –

答えて

7

を返しGQLは、あなたがfull text searchを使用する必要がありますことを達成するために、ワイルドカードが一致していません。

3

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

+1

はその共通の実践ですか?ハックのようだ。 – mehulkar

+0

うわー..この答えで本当に驚いています。:-( – CIF

+0

私はこれを自分で実装していませんが、私はそれが他の場所を推奨しているのを見ました(申し訳ありませんが、私はリンクを持っていません)。 – Trevor

5

注:この質問には正確には答えられませんが、最初に探している人はこの回答が役立つかもしれません。

NDBの文字列フィールドは、(>=)より大きく、(<)より小さい検索方法でインデックスされます。次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の結果に制限されているすべての人々を取得します。制限のため、krosslarkのような名前は除外されます。

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

+0

これは、全文検索を実装する必要なしに、単純な部分文字列一致検索を見つけることができます。 – werm098

関連する問題