2010-03-13
Google App Engineでの検索パターン
id:higayasuo さんにTwitter上でいろいろ教わったので、メモ。
検索条件が複雑な場合
業務アプリなどでよく見かける、複雑(不特定)な条件で、かつ、特定の並び順でデータを抽出するような場合のパターンです。
例えば、
データを抽出する条件が
「場所」「日時」「部署」「担当者」...と複数あったとして、
それぞれの項目が、
ユーザーによって指定されたり、されなかったりした場合、ソートがあるために、
入力、未入力の組み合わせの数だけ複合インデックスが必要ですが、
(Datastoreではフィルターとソートのプロパティが異なると複合インデックスが必要です。)
これを全て静的に(事前に)定義するのは非現実的です。
で、id:higayasuo さんのアドバイス
adhokなqueryはeq filterだけqueryで実行してnot_eqやsortはin-memoryでやるのが最も簡単。pagingや件数の問題さえなければそれで大丈夫 #appengine
eqだけであれば、複数のfilterを重ねてもマージジョインで動的に処理されるため、
複合インデックスの定義は不要です。
メモリ上でのnot_eqやsortは、slim3を使えば簡単です。
http://sites.google.com/site/slim3documentja/documents/slim3-datastore/queries-and-indexes#TOC-18
範囲検索の場合
例えば、「現在、受付期間中のイベントを検索」のような場合、
#appengine で範囲検索するときはstartからendまでの各値をListにいれてeq filterを使うのが良いと思う。startからendまでの値が大きい場合は、適度にブロック化すると良い...
例えば、日付のstartとendなら月をListにいれて月のeq filterで絞り込んだ後にin-memory filterで<=と>=を使う
start:3/1 end:3/31なら[20100301,20100302,...,20103031]をリストに書いておき、eq(20100312)でfilterをかければ良い
もう、何も言う事はありません。これしか無いですね。
コメントを書く
トラックバック - http://d.hatena.ne.jp/knj77/20100313/1268447499
リンク元
- 57 http://twitter.com/KNJ77
- 41 http://twitter.com/
- 32 http://www.slideshare.net/knj77/slim3-3832245
- 24 http://www.tdtsh.com/blog/archives/346
- 21 http://reader.livedoor.com/reader/
- 18 http://togetter.com/li/17225
- 15 http://static.slidesharecdn.com/swf/player.swf
- 11 http://hootsuite.com/dashboard
- 8 http://www.google.co.jp/reader/view/
- 7 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&hs=dXx&rlz=1R1MOZA_ja___JP346&q=index??????+appengine&lr=&aq=f&aqi=&aql=&oq=&gs_rfai=