2013-01-12 16 views
5

Bu kolay bir soru gibi görünüyor. Ancak the docs yanıt vermiyor gibi görünüyor. onlardan örneği kullanarak, bunu yapmak istiyorum: Ben de kısmi dizeleri eşleştirmek istediğiniz hariçndb Sorgu kısmi dizgi eşlemesi

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

. Bu senaryoya göre Yani:

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

argümanı ile ndb sorgu "en iyi" acct eşleşir.

Şu anda görebildiğim tek seçenek, Account.query() aracılığıyla döngü yapmak ve her title'u python'da re.search modülü ile eşleştirmektir. Bu iyi bir çözüm gibi görünmüyor.

Güncelleme: Ayrıca gql da arıyorum. Bunu yapmak:

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

bir Parse Error: Invalid WHERE Condition at symbol LIKE

+0

GQL SQL değil. –

cevap

7

GQL Eğer full text search kullanmanız gerekecektir Bunu başarmak için, eşleştirme joker yok döndürür.

3

Başlık gibi bir (muhtemelen) kısa bir alan için, başlığın her sözcüğünü içeren bir tekrarlanan StringProperty eklenmesi (durma sözcüklerinin yok sayılması, belki de) sözcüklerle eşleşebilmenizi sağlar ve arama API'sini kullanmanızdan daha kolay olur .

+1

bu yaygın uygulamadır? Bir hack gibi görünüyor. – mehulkar

+0

wow .. bu cevapla gerçekten şaşırdım .. :-( – CIF

+0

Diğer yerleri tavsiye ettiğim halde (üzgünüm, bir bağlantım yok) bu kendimi uygulamamıştım. – Trevor

5

NOT: Bu, soruyu tam olarak yanıtlamıyor, ancak aramaya başlayan bir kişi bu yanıtı yararlı bulabilir.

NDB'nin Dize alanı, (>=) boyutundan daha büyük ve (<) aramadan daha küçük bir şekilde dizine eklenmiştir. Aşağıdaki Person modeli varsayarsak:

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

Aşağıdaki yapabilirsiniz:

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') 

bu örnekte limit değişken dizesi 'krj' içeren ve arama değer sınırını veririz. Yukarıdakiler, adı kri'dan daha büyük ancak krj'dan küçük olan ve ilk 50 bulguyla sınırlanan tüm insanları size sağlayacaktır. Limit nedeniyle, kross ve lark gibi isimler filtrelenecektir.

Not: Aramak istediğiniz alanın küçük harf versiyonunu içermek üzere bir ndb.ComputedProperty ürününe sahip olmanız önemlidir. Bunu eklemeyi unutma!

+0

Bu en iyi çözümdür. Tam metin aramasına gerek kalmadan arama ile eşleşen basit bir kısmi dizge bulabilir. – werm098