web2py как эквиваленты с движком приложений Google - PullRequest
2 голосов
/ 22 декабря 2010

Есть ли способ генерировать запросы, подобные операторам like, contains, startswith, с базой данных BigTable движка приложений?

Чтобы я мог сделать что-то похожее на:

db(db.some_table.like('someting')).select()

с движком приложения в web2py.

1 Ответ

7 голосов
/ 22 декабря 2010

Движок приложения не поддерживает полнотекстовый поиск, поэтому краткий ответ - нет.

Что вы можете сделать с web2py - это создать вычисляемый файл со списком ключевых слов для поиска.

 def tokenize(r): return [x.lower() for x in re.compile('\w+').findall(r.title)]

 db.define_table('data',
    Field('title'),
    Field('keywords','list:string',compute=tokenize,writable=False,readable=False))

В GAE в качестве поля ключевых слов используется StringListProperty ().

Тогда вместо поиска по заголовку вы будете искать по ключевым словам:

 rows = db(db.data.keywords.contains(my_keyword.lower())).select()

Это работает на GAE и очень эффективно. Теперь проблема в том, что вы не будете использовать его в сложных запросах из-за проблемы «взрывающихся» индексов GAE. Например, у вас есть N ключевых слов и вы хотите найти два ключевых слова:

 rows = db(db.data.keywords.contains(my_keyword1.lower())&
           db.data.keywords.contains(my_keyword2.lower())).select()

Ваш размер индекса становится N ^ 2. Поэтому вы должны выполнять более сложные запросы локально:

 query2=lambda r: my_keyword1.lower() in r.keywords
 rows = db(db.data.keywords.contains(my_keyword1.lower())).select().find(query2)

Все это также будет работать на GAE и не на GAE. Это портативный.

...