appengineのSearch Service(full-text search) はまだexperimentalですが非常に魅力的な機能です。
正式リリースされればデータの種類によってはDatastoreの代わりに使用することもできそう。最大の特徴は検索の柔軟性にあるでしょうか。
ただし使ってみていくつか不思議な仕様に気づいたので注意が必要。簡単にまとめてみます。

DATE型は時刻を持てない

DATE: a date with no time component とドキュメントにあるようにあくまで日付だけしか持てないようです。
timestampを管理したい場合などはちょっと工夫が必要ですね。
自分はNUMBER型を使用して、特定日時(例えば2010-01-01 00:00:00)からの秒数で保持するようにしました。
※NUMBER型の範囲は -2,147,483,647 ~ 2,147,483,647

DATE型はSDKにバグ?

eclipseの環境でtime部分をクリアしたDateをこのフィールドに渡しても、= のクエリーでヒットしません。
例えば今日が 2013-04-24 だとして、 new Date() をセットすると、date_field = 2013-04-24 でも date_field >= 2013-04-24 でもヒットしません。
production環境ではtime部分をクリアしてもしなくても = でヒットします。

TEXT型は同一フィールド名で複数の値を保持可能

addFieldを繰り返して同じフィールド名に異なる値を追加できるようです。


Document.newBuilder()
    .addField(Field.newBuilder().setName("text1").setText("hoge")
    .addField(Field.newBuilder().setName("text1").setText("fuga")
    .build();

HTML型も可能でしたがNUMBER型はExceptionが発生しました。

TEXT型に = でクエリーした場合、どういう条件でヒットする?

Numeric operators only match against numeric and date fields. と書いてありますので当然かもしれませんが、TEXT型に = を指定したクエリーを実行しても完全一致にはなりませんでした。
例えば、text_field = hoge というクエリーを実行した場合に

  • “hoge_2” はヒットしません。
  • “this is hoge” はヒットします。
  • “@hoge” はヒットします。

という結果でした。
さらにSDKでは全然結果が異なりました。。(これもバグ??)

完全一致が使えると(全文検索以外に)使い途が広がるのですが、文字種を限定するなど工夫が必要そうです。

とりあえず気づいたのはこんなところですがまだまだ落とし穴があるかもしれません。

コメントは受け付けていません。