2013-05-06 2 views
7

Я использую ndb.Model. The Search API имеет следующие классы полей:Google App Engine - с помощью Search API Python со списком полей

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 

Пусть у меня есть поле «теги», который представляет собой поле списка:

tags = ndb.StringProperty(repeated=True) 

Как я должен относиться к этой области с search.Document?

Сейчас я превращаюсь tags список в строку:

t = '|'.join(tags) 

А потом:

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

Любые предложения?

+0

Пара вопросов. 1. Зачем использовать текстовый поиск для тегов, thats подходит для запросов хранилища данных. 2, Зачем сцепляться с '|' почему не пробел символ –

+0

Эй, Тим. 1. Я хочу, чтобы пользователь мог ввести одно слово в поле поиска формы и использовать его для поиска по различным полям. Предположим, что он входит в «Карпентер», результаты будут включать «Карпентер» в качестве тега (например, работа) и «Карпентер» в качестве фамилии. 2. Я соединяю трубку, потому что там могут быть два тега типа «Профессиональный читатель». –

+0

Datastore не подходит, если вы хотите выполнять соединения или перекрестки тегов. – moraes

ответ

6

Используйте уникальные идентификаторы для каждого «тега». После этого вы можете создать документ, как:

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

Вы даже можете использовать номера (ID) как строки:

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

и запросов с использованием операторов, как вы хотите:

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

Спасибо, moraes, я собираюсь попробовать это. –

5

Вы должны добавьте столько полей, сколько «тегов» у вас есть, все с одинаковым полем_имя:

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

Как и в документации:

Поле может содержать только одно значение, которое должно соответствовать типу поля. Имена полей не обязательно должны быть уникальными. Документ может иметь несколько полей с тем же именем и одним и тем же типом, что позволяет представлять поле с несколькими значениями. (Однако поля даты и числа с тем же именем не могут быть повторены.) Документ также может содержать несколько полей с тем же именем и разными типами полей.

+2

Это действительно рекомендуемый подход. ПРИМЕЧАНИЕ. В настоящее время консоль администратора не показывает несколько полей с тем же именем ... так что появится только «последнее поле» ... когда на самом деле все они есть –