2013-05-06 13 views
7

Używam ndb.Model. The Search API ma następujących klas polu:Google App Engine - korzystanie z Python Search API z polami listy

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 

Załóżmy, że mam pole 'Tagi', która jest polem wykazu:

tags = ndb.StringProperty(repeated=True) 

Jak mam traktować to pole z search.Document?

Teraz ja obracam tags listy na ciąg znaków:

t = '|'.join(tags) 

, a następnie:

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

Wszelkie sugestie?

+0

Kilka pytań. 1. Po co używać wyszukiwania tekstowego dla tagów, które pasuje do zapytań w magazynie danych. 2, po co łączyć się z "|" czemu nie ma charakteru przestrzeni –

+0

Hej Tim. 1. Chcę, aby użytkownik mógł wpisać jedno słowo w polu wyszukiwania formularza i użyć go do przeszukiwania różnych pól. Przypuśćmy, że wejdzie on w "Carpenter", a wyniki będą obejmować "Carpenter" jako tag (na przykład zadanie) i "Carpenter" jako nazwisko. 2. Łączę się za pomocą potoku, ponieważ mogą istnieć dwa znaczniki słów, takie jak "Professional Reader". –

+0

Składnica danych nie jest odpowiednia, jeśli chcesz wykonywać związki lub przecięcia znaczników. – moraes

Odpowiedz

6

Użyj unikalnych identyfikatorów dla każdego "tagu". Następnie można utworzyć dokument jak:

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

Można nawet użyć liczb (IDS) jak ciągi:

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

i kwerendy z użyciem operatorów, jak chcesz:

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

Dzięki, moraes, spróbuję tego. –

5

Powinieneś dodaj tyle pól, co "znaczniki", które masz, wszystkie z tą samą nazwą pola:

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

Tak jak w dokumentach:

Pole może zawierać tylko jedną wartość, która musi być zgodna z typem pola. Nazwy pól nie muszą być unikalne. Dokument może mieć wiele pól o tej samej nazwie i tym samym typie, co jest sposobem reprezentowania pola z wieloma wartościami. (Jednak pola daty i numeru o tej samej nazwie nie mogą się powtarzać.) Dokument może również zawierać wiele pól o tej samej nazwie i różnych typach pól.

+2

Jest to rzeczywiście zalecane podejście. UWAGA: konsola administracyjna nie wyświetla obecnie wielu pól o tej samej nazwie ... więc okaże się, że dodano tylko "ostatnie pole" ... kiedy w rzeczywistości wszystkie są –

Powiązane problemy