2013-05-06 5 views
7

Uso ndb.Model. The Search API ha le seguenti classi di campo:Google App Engine: utilizzo dell'API di ricerca Python con campi elenco

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 

Supponiamo che io sono un campo di 'tag', che è un campo lista:

tags = ndb.StringProperty(repeated=True) 

Come faccio a trattare questo campo con search.Document?

In questo momento sto girando tags lista in una stringa:

t = '|'.join(tags) 

E poi:

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

Qualche suggerimento?

+0

Un paio di domande. 1. Perché usare la ricerca del testo per i tag, questo è adatto alle query del datastore. 2, Perché concatenare con '|' perché non lo spazio personaggio –

+0

Hey Tim. 1. Voglio che l'utente possa inserire una parola nel campo di ricerca del modulo e usarlo per cercare tra diversi campi. Supponiamo che entri in "Carpenter", i risultati includeranno "Carpenter" come tag (un lavoro, ad esempio) e "Carpenter" come cognome. 2. Sto concatenando utilizzando il pipe perché potrebbero esserci due tag di parole come "Professional Reader". –

+0

Il datastore non è adatto se si desidera eseguire unioni o intersezioni di tag. – moraes

risposta

6

Utilizzare identificativi univoci per ciascun "tag". Quindi è possibile creare un documento simile:

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

È anche possibile utilizzare i numeri (IDS) come stringhe:

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

e query utilizzando gli operatori come si desidera:

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

Grazie, mora, ci proverò. –

5

Si dovrebbe aggiungi tanti campi quanti "tag" che hai, tutti con lo stesso nome_campo:

doc = search.Document(fields=[ 
    search.TextField(name='tag', value=t) for t in tags 
]) 

Come nella documentazione:

un campo può contenere un solo valore, che deve corrispondere il tipo di campo. I nomi dei campi non devono essere unici. Un documento può avere più campi con lo stesso nome e lo stesso tipo, che è un modo per rappresentare un campo con più valori. (Tuttavia, i campi data e numero con lo stesso nome non possono essere ripetuti.) Un documento può anche contenere più campi con lo stesso nome e diversi tipi di campo.

+2

Questo è davvero l'approccio consigliato. NOTA: la console di amministrazione non mostra attualmente più campi con lo stesso nome ... quindi apparirà che solo "l'ultimo campo" è stato aggiunto ... quando in realtà sono tutti lì –