2012-01-10 14 views
2

は私が見えるエンティティがあるとし、このようなビット:Google App Engineの - 他の性質上、キーワード検索+順序

query = MyEntity.all()\ 
       .filter('keywords >=', unicode(kWord))\ 
       .filter('keywords <', unicode(kWord) + u"\ufffd")\ 
       .order('keywords') 

class MyEntity(db.Model): 
    keywords   = db.StringListProperty() 
    sortProp   = db.FloatProperty() 

私はこれを行うことにより、キーワード検索を行うフィルタを持っています

これはうまくいきます。私が実行している問題は、 'sortProp'を使用して注文しようとすると、それは:

   .order('sortProp') 

並べ替えの効果はありません。

一つの重要な注意点が平等の両方を含むクエリです:ドキュメントは、特にこれが不可能であると(Googleドキュメントからの)複数の値を持つプロパティに等式フィルタを使用した場合、そのソート順は無視されると言う - 私はなぜ実現します複数の値を持つプロパティの並べ替え順序は です。これらのクエリでは、並べ替え の順序は無視されます。単一値プロパティの場合、これは単純な の最適化です。すべての結果はプロパティの値が同じであるため、結果を並べ替える必要はありません。 ただし、複数値の プロパティには追加値が含まれている場合があります。ソート順は であるため、クエリ結果はソート順が適用された場合とは異なる の順番で返されます。 (ソートドロップ高価になる を注文すると、余分なインデックスを必要とし、クエリプランナはそれを残して、このユースケースは、 まれです復元。)

私の質問をされ

:誰がために良い回避策を知っているんこの?この制限を回避するキーワード検索を行うより良い方法はありますか?私は本当に他のプロパティのための順序とキーワードを使用して結合したいと思います。私が考えることができる唯一の解決策は、クエリの後にリストをソートすることですが、私がそれを行うとクエリにオフセットする能力がなくなり、データセットが大きい場合に最高のソート順で結果を得ることさえできないかもしれません。

あなたのヒントありがとうございます!

+0

フルテキスト検索をご利用の場合は、Truster Testerプログラムにサインアップして、新しいapi:https://docs.google.com/a/google.com/spreadsheet/viewform?formkey= dEdWcnRJUXZ2VGR3YmVsT1Q1WVB2Smc6MQ – proppy

答えて

1

接頭辞のマッチングを行う代わりに、文字列を適切にトークン化し、ステムを正規化して正規化し、それらの等価比較を実行します。

+0

これは結局最も簡単な方法です。 –

2

回避策1: キーワードにステミングアルゴリズムを適用すると、比較ルックアップを行う必要はありません。

回避方法2: すべてのユニークなキーワードを別のエンティティグループ(「テーブル」)に格納します。このグループから、条件に一致するキーワードを見つけます。次に、keywords IN [kw1, kw2, ...]でクエリを実行します。たとえば、あなたが選択することができ、一致するキーワードの数が大きすぎるではないことを確認してください最初の10

回避策3:アプリケーション側でのアイテムの 並べ替えリスト

回避策4:フルため 使用IndexTankテキスト検索、または@proppyのように "Trusted Tester Program"を申請することができます。

+0

+1私は2と一緒に行きたいと思っています。 –

関連する問題