2013-05-06 19 views
7

liste alanları ile ara API Python kullanma. Arama API aşağıdaki alan sınıfları vardır:Google App Engine - Ben ndb.Model kullanıyorum

TextField : plain text 
    HtmlField : HTML formatted text 
    AtomField : a string which is treated as a single token 
    NumberField : a numeric value (either float or integer) 
    DateField : a date with no time component 
    GeoField : a locale based on latitude and longitude 

Bir liste alanı olan bir 'Etiket' alanını sahip varsayalım: Ben search.Document ile bu alanı tedavi etmek için nasıl yapayım

tags = ndb.StringProperty(repeated=True) 

? Şu anda

ben bir dizeye tags listeyi çeviriyorum: o zaman

t = '|'.join(tags) 

Ve:

search.TextField(name=cls.TAGS, value=t) 

herhangi bir öneriniz? Her "tag" için

+0

soru bir çift. 1. Neden etiketler için metin aramayı kullanırız, bu datastore sorgularına uygundur. 2, niçin '|' ile birleşin neden uzay karakteri değil –

+0

Hey Tim. 1. Kullanıcının form arama alanına bir sözcük girmesini ve farklı alanlar arasında arama yapmasını istiyorum. Sonuçlar (örneğin bir iş,) bir etiket olarak 'Carpenter' ve 'Carpenter' olarak soyadı yer alacak, o Carpenter 'girer varsayalım. 2. Boruyu kullanarak birleştirme yapıyorum çünkü 'Profesyonel Okuyucu' gibi iki kelime etiketi olabilir. –

+0

Etiketleri veya etiket kesişimlerini gerçekleştirmek istiyorsanız Datastore uygun değildir. – moraes

cevap

6

kullanın benzersiz tanımlayıcılar. dizeleri olarak

doc = search.Document(fields=[ 
    search.TextField(name='tags', value='tag1 tag2 tag3'), 
]) 
search.Index(name='tags').put(doc) 

Hatta kullanabilirsiniz numaralar (kimlikleri): O zaman böyle bir belge oluşturabilir Eğer operatörlerini kullanarak

doc = search.Document(fields=[ 
    search.TextField(name='tags', value='123 456 789'), 
]) 

Ve sorguda istedikleri gibi:

index = search.Index(name='tags') 
results = index.search('tags:(("tag1" AND "tag2") OR ("tag3" AND "tag4"))') 
+0

Teşekkürler moraes, bunu deneyeceğim. –

5

Gitmelisiniz

doc = search.Document(fields=[ 
    search.TextField(name='tag', value=t) for t in tags 
]) 
: 'etiketleri' var, aynı FIELD_NAME tüm olduğunca çok alanı eklemek docs gibi

:

Bir alan alanın türünün aynı olmalıdır yalnızca bir değeri içerebilir. Alan isimlerinin benzersiz olması gerekmez. Bir belgenin, aynı ada sahip ve aynı türde birden çok alanı olabilir; bu, bir alanı birden çok değerle temsil etmenin bir yoludur. (Ancak, aynı ada sahip tarih ve sayı alanları tekrarlanamaz.) Bir belge, aynı ada sahip farklı alan türleri de içerebilir.

+2

Bu gerçekten önerilen yaklaşımdır. NOT: Yönetici konsolu şu anda aynı ada sahip birden çok alan göstermiyor ... bu nedenle, yalnızca "son alan" ın eklendiğini göreceksiniz ... aslında hepsi orada olduğunda –