1

私は過去数日間、GoogleAppEngineで適切なページングを行う方法を理解するために時間を費やしてきました。実行可能な解決策ができたら、多くの人がこれに苦労しているのを見て、グーグルコードでそれらを公開します。

目標:次の機能を備えた、GAE用のシンプルで強力なページングソリューションを作成します。

  • 順方向および逆方向のページング、最初のページと最後のページのサポート
  • フィールドの(サブセット)による並べ替え(一度に1つの順序のみ)
  • 同様の方法でフィルタリング基準を設定します(たとえば、「Tom」と入力すると、「Tom」で始まる名前の人物のみがフィルタリングされて表示されます)
  • ページの総数を追跡する

設計上の決定:

  • スケーリングしないため、制限/オフセットを使用しないでください。代わりにカーソルに依存します
  • シャーディングを使用して、ページの総数を最新の状態に保ちます
  • 妥協を受け入れますが、最高のパフォーマンス/スケーラビリティを目指します

障害(つまり最後の砦):残っている唯一の問題は、フィルタリング基準(たとえば、名前が「Tom」で始まる)と別のプロパティの並べ替え基準がある場合だと思います。

例:人[名前、年齢]

  • 名前でフィルタリング'Tom*'
  • 年齢で並べ替え

ドキュメントを読んで、私は解決策を見つけたと思いました:

Query q = new Query("Person");
q.addFilter("name", FilterOperator.GREATER_THAN_OR_EQUAL, nameFilter);
q.addFilter("name", FilterOperator.LESS_THEN, nameFilter + "\uFFFD");
q.addSort("name", SortDirection.ASCENDING);
q.addSort("age", SortDirection.ASCENDING);

私はこれが戻ると思った:

  • Tom2 18
  • Tom1 20

残念ながら、これは

  • Tom1 20
  • Tom2 18

クエリは最初に名前でフィルタリングされ、次に2次キーとして年齢でフィルタリングされます。

私が考えることができる唯一の解決策は、フィルター結果全体をJava構造に入れ、コンパレーターを使用してソートしてから、表示するレコードを選択することです。しかし、これには私のカーソルロジックが消えるという追加の問題があります。これは、ページングを解決するための2つの論理パスがあることを意味します。これが究極の解決策かもしれませんが、もっと賢い人がもっと良いアイデアを持っているのではないかと思います。

どんなアイデアでも大歓迎です。

ありがとう、マティアス

4

2 に答える 2

2

全文検索を見たいと思うかもしれません。 http://googleappengine.blogspot.jp/2012/05/looking-for-search-find-it-on-google.html

名前のインデックスを作成する場合は、(文書化されていない)'〜'演算子を使用して語幹の照合を行うことができるはずです。次のリリースでGoogleの誰かによって文書化されると言われました(私は信じています)ここでGAE全文検索APIフレーズマッチング

エンティティIDをテキストインデックスに入れると、その名前の語幹を含むエンティティのリストが作成され、キーのリストでフィルタリングして年齢で並べ替えることができなくなります。

ショーン

更新:ドキュメントがリリースされたので、「〜」演算子は語幹一致ではなく、単に複数形であることがわかります

正確なクエリの複数形を検索するには、〜演算子を使用します。〜 "car"#"car"と"cars"を検索します

于 2012-06-20T22:16:43.063 に答える
1

最初の推奨事項は、名前に不等式フィルターを使用しないことです。不等式フィルターを使用する必要がある場合は、年齢で並べ替える前に名前で並べ替える必要があります。ページングしたい場合は、結果全体を並べ替えてページングする方法を理解する必要があるためです。

UI を使用するか、データストアの名前フィールドを非正規化することにより、不等式フィルターを回避する方法を見つけようとして、これに取り組みます。

なぜ Tom1 と Tom2 を使用するのかはよくわかりませんが、多数の Tom を使用することがわかっている場合は、"Tom" のみを格納する name_base フィールドを使用することができます。不平等。

于 2012-06-20T19:58:25.053 に答える