2

アプリ エンジンの BigTable データベースを使用して、、、演算子に likecontainsたクエリを生成する方法はありますか?startswith

次のようなことができるように:

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

web2py のアプリエンジンで。

4

1 に答える 1

7

App Engine は全文検索をサポートしていないため、短い答えはノーです。

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 個のキーワードがあり、2 つのキーワードを検索したいとします。

 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 で動作します。ポータブルです。

于 2010-12-22T20:26:11.107 に答える