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をかければ良い


もう、何も言う事はありません。これしか無いですね。