2010-12-22 51 views
2

有没有什么办法可以生成与like,contains,startswith运营商与应用程序引擎BigTable数据库类似的查询?web2py像谷歌应用程序引擎相当于

,这样我可以做类似的东西:在web2py中

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

与App Engine。

+0

从http://stackoverflow.com/questions/1554600/implementing-starts-with-and-ends-with-queries-with-google-app-engine;其他2个是不可能的。 – geoffspear 2010-12-22 19:34:46

回答

7

应用引擎不支持全文搜索,所以简短的回答是否定的。

你可以用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。它是便携式的。

+0

谢谢!很好的答案 – crodjer 2010-12-23 04:14:38