【问题标题】:web2py like equivalents with google app engineweb2py 类似于 google 应用引擎的等价物
【发布时间】:2011-05-29 13:42:11
【问题描述】:

有没有办法使用应用引擎 BigTable 数据库生成类似于likecontainsstartswith 运算符的查询?

这样我就可以做类似的事情:

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

在 web2py 中使用应用引擎。

【问题讨论】:

标签: google-app-engine web2py bigtable


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2020-05-17
    相关资源
    最近更新 更多