有没有办法使用应用引擎 BigTable 数据库 生成类似于like
, contains
,运算符的查询?startswith
这样我就可以做类似的事情:
db(db.some_table.like('someting')).select()
使用 web2py 中的应用程序引擎。
有没有办法使用应用引擎 BigTable 数据库 生成类似于like
, contains
,运算符的查询?startswith
这样我就可以做类似的事情:
db(db.some_table.like('someting')).select()
使用 web2py 中的应用程序引擎。
应用引擎不支持全文搜索,所以简短的回答是否定的。
你可以用 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。它是便携式的。