市中弾き語りの刑 このページをアンテナに追加 RSSフィード

2010-03-13

Google App Engineでの検索パターン

| 11:31 | Google App Engineでの検索パターンを含むブックマーク 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