2010-12-22 27 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