web2py 就像谷歌应用程序引擎的等价物

发布于 2024-10-08 17:24:49 字数 228 浏览 3 评论 0原文

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

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

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

在 web2py 中使用应用程序引擎。

Is there any way to generate queries similar to the like, contains, startswith operators with app engine BigTable database?

So that I could do something similar to:

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

with app engine in web2py.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你不是我要的菜∠ 2024-10-15 17:24:49

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

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

App engine does not support full text search so short answer is no.

What you can do with web2py is create a computed filed with a list of keywords to search for.

 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))

On GAE the keywords field is a StringListProperty().

Then instead of searching in title, you search in keywords:

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

This works on GAE and it is very efficient. The problem now is that you will not be used to combine it in complex queries because of the GAE "exploding" indexes problem. For example is you have N keywords and want to search for two keywords:

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

Your index size becomes N^2. So you have to perform more complex queries locally:

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

All of this will also work on GAE and not-on-GAE. It is portable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文