アプリ エンジンの BigTable データベースを使用して、、、演算子に like
似contains
たクエリを生成する方法はありますか?startswith
次のようなことができるように:
db(db.some_table.like('someting')).select()
web2py のアプリエンジンで。
アプリ エンジンの BigTable データベースを使用して、、、演算子に like
似contains
たクエリを生成する方法はありますか?startswith
次のようなことができるように:
db(db.some_table.like('someting')).select()
web2py のアプリエンジンで。
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 で動作します。ポータブルです。