2013-05-06 14 views
7

Ich verwende ndb.Model. Die Search API hat die folgenden Feldklassen:Google App Engine - Verwenden der Such-API Python mit Listenfeldern

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 

Angenommen, ich habe ein Feld ‚Tags‘, die ein Listenfeld ist:

tags = ndb.StringProperty(repeated=True) 

Wie soll ich dieses Feld behandeln mit search.Document?

Im Moment bin ich drehen tags Liste in einen String:

t = '|'.join(tags) 

Und dann:

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

Irgendwelche Vorschläge?

+0

Ein paar Fragen. 1. Warum Textsuche für Tags, das ist für Datenspeicherabfragen geeignet. 2, Warum verketten mit '|' Warum nicht Leerzeichen –

+0

Hey Tim. 1. Ich möchte, dass der Benutzer ein Wort in das Formularsuchfeld eingeben und damit verschiedene Felder durchsuchen kann. Angenommen, er gibt "Carpenter" ein, werden die Ergebnisse "Carpenter" als Tag (ein Job zum Beispiel) und "Carpenter" als Nachname enthalten. 2. Ich verkette mit der Pipe, weil es zwei Word-Tags wie "Professional Reader" geben könnte. –

+0

Der Datenspeicher ist nicht geeignet, wenn Sie Verbindungen oder Überschneidungen von Tags durchführen möchten. – moraes

Antwort

6

Verwenden Sie eindeutige Kennungen für jedes "Tag". Dann können Sie ein Dokument wie erstellen:

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

können Sie auch Zahlen verwenden (ids) als Strings:

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

Und Abfrage mit Hilfe von Operatoren, wie Sie wollen:

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

Danke, Moraes, ich werde es versuchen. –

5

Sie sollten fügen Sie so viele Felder wie 'Tags' hinzu, die Sie haben, alle mit dem gleichen field_name:

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

Wie in der Dokumentation:

kann ein Feld nur einen Wert enthalten, der das Feld des Typ übereinstimmen müssen. Feldnamen müssen nicht eindeutig sein. Ein Dokument kann mehrere Felder mit demselben Namen und demselben Typ haben, wodurch ein Feld mit mehreren Werten dargestellt wird. (Datums- und Nummernfelder mit demselben Namen können jedoch nicht wiederholt werden.) Ein Dokument kann auch mehrere Felder mit demselben Namen und unterschiedlichen Feldtypen enthalten.

+2

Dies ist in der Tat der empfohlene Ansatz. HINWEIS: In der Admin-Konsole werden derzeit nicht mehrere Felder mit demselben Namen angezeigt. Es scheint also, dass nur das "letzte Feld" hinzugefügt wurde ... obwohl sie alle vorhanden sind –