本当にシンプルなもの。SQLでは、テキストフィールドでいくつかの文字を検索する場合は、次のようにします。
SELECT blah FROM blah WHERE blah LIKE '%text%'
App Engineのドキュメントには、これを達成する方法についての言及はありませんが、確かにそれは一般的な十分な問題ですか?
本当にシンプルなもの。SQLでは、テキストフィールドでいくつかの文字を検索する場合は、次のようにします。
SELECT blah FROM blah WHERE blah LIKE '%text%'
App Engineのドキュメントには、これを達成する方法についての言及はありませんが、確かにそれは一般的な十分な問題ですか?
回答:
App EngineのデータベースバックエンドであるBigTableは、数百万のレコードに拡張されます。このため、十分にデータが設定されたテーブルではパフォーマンスが非常に悪くなるため、App Engineではテーブルスキャンを実行するクエリを実行できません。
つまり、すべてのクエリでインデックスを使用する必要があります。これは、あなただけ行うことができる理由です=
、>
そして<
クエリ。(実際に実行することもできます!=
が、APIは>
and <
クエリの組み合わせを使用してこれを実行します。)これは、開発環境が実行するすべてのクエリを監視し、不足しているインデックスを自動的に追加する理由でもあります。index.yaml
ファイルにます。
LIKE
クエリのインデックスを作成する方法がないため、クエリを使用できません。
この詳細については、このGoogle IOセッションをご覧ください。
私は同じ問題に直面していますが、Google App Engineページで何かを見つけました:
ヒント:クエリフィルターには、文字列値の一部のみを一致させる明示的な方法はありませんが、不等式フィルターを使用してプレフィックスの一致を偽造できます。
db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
"abc",
u"abc" + u"\ufffd")
これは、すべてのMyModelエンティティを、文字abcで始まる文字列プロパティpropと一致させます。Unicode文字列u "\ ufffd"は、可能な最大のUnicode文字を表します。プロパティ値がインデックスで並べ替えられている場合、この範囲内の値は、指定されたプレフィックスで始まるすべての値です。
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html
多分これはトリックを行うことができます;)
App EngineはLIKEクエリをサポートしていませんAltough、プロパティを見ていListPropertyとStringListPropertyを。これらのプロパティで同等性テストが行われると、テストは実際にはすべてのリストメンバーに適用されます。たとえば、list_property = value
値がリストのどこかにあるかどうかのテストです。
この機能は、LIKEクエリがない場合の回避策として使用される場合があります。たとえば、この投稿で説明されているように、単純なテキスト検索を実行できます。
SQLと同様の全文検索クエリを実行するには、検索サービスを使用する必要がありますLIKE
。
Gaelykは、ドメイン固有の言語を提供して、より多くを実行しますユーザーフレンドリーな検索クエリ。たとえば、次のスニペットは、タイトルを含みfern
、ジャンルが完全に一致する最新の本からソートされた最初の10冊の本を見つけますthriller
。
def documents = search.search {
select all from books
sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE
where title =~ 'fern'
and genre = 'thriller'
limit 10
}
LikeはGroovyの一致演算子として書かれてい=~
ます。などの機能にも対応してdistance(geopoint(lat, lon), location)
います。
App Engineが汎用の全文検索サービスを開始は、データストアをサポートするバージョン1.7.0でました。
発表の詳細。
これを使用する方法の詳細:https : //cloud.google.com/appengine/training/fts_intro/lesson2
Objectifyをご覧ください。これは、データストアアクセスAPIのようなものです。具体的にはこの質問に関するFAQがあります。ここに答えがあります
likeクエリを実行する方法(LIKE "foo%")
格納および検索時に順序を逆にすると、startWithまたはendWithのようなことができます。希望する開始値と希望する値のすぐ上の値で範囲クエリを実行します。
String start = "foo";
... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");
ここをフォローするだけです:init.py#354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py#354
できます!
class Article(search.SearchableModel):
text = db.TextProperty()
...
article = Article(text=...)
article.save()
To search the full text index, use the SearchableModel.all() method to get an
instance of SearchableModel.Query, which subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:
query = article.all().search('a search query').filter(...).order(...)
これをGAE Datastore低レベルJava APIでテストしました。私と完璧に動作します
Query q = new Query(Directorio.class.getSimpleName());
Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query);
Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD");
Filter filterNombre = CompositeFilterOperator.and(filterNombreGreater, filterNombreLess);
q.setFilter(filter);
一般的に、これは古い投稿ですが、「LIKE」または「ILIKE」を生成する方法は、「> =」クエリからすべての結果を収集し、次に、Pythonで結果をループすることです。探しています。
aq = 'luigi'を指定してユーザーをフィルタリングするとします。
users = []
qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower()))
for _qry in qry:
if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower():
users.append(_qry)
もし LIKE '%text%'
常に1つまたはいくつかの単語(置換を考える)と比較し、データの変化が遅い場合(ゆっくりとは、インデックスを作成および更新するために、価格とパフォーマンスの両方で法外に高価ではないことを意味します)、Relation Index Entity(RIE)答えかもしれません。
はい、追加のデータストアエンティティを作成し、適切に入力する必要があります。はい、試してみる必要があるいくつかの制約があります(GAEデータストアのリストプロパティの長さの上限は5000です)。しかし、結果の検索は非常に高速です。
詳細については、JavaとOjbectifyを使用したRIEとPythonを使用したRIEの投稿を参照してください。
「いいね」はテキスト検索の貧しい人の代用としてよく使われます。テキスト検索の場合、Whoosh-AppEngineを使用できます。