Google App Engineの検索APIでは、SortExpressionを定義することができます。一番簡単な方法が、日付によるソートです。以下のコードで、新しい順に検索結果を取得することができます。

search.SortExpression(expression='date' direction=search.SortExpression.DESCENDING, default_value=0)


しかし、これだけだと、日付だけでソートされてしまうため、あまりユーザビリティが高くありません。ユーザからの評価の高いものや、ブックマーク数が多いものなどで重み付けをしたくなります。

expressionには、式が記述できるため、以下のようにすることで、任意のスコアで検索結果をソートすることができます。

search.SortExpression(expression='bookmark_cnt*5+like_cnt' ,
direction=search.SortExpression.DESCENDING, default_value=0)


しかし、古い投稿ほどブックマーク数は多くなりがちなので、まだ不十分です。新しい投稿ほど、先に表示しやすくしたくなります。しかし、dateプロパティはそのままだと式に使用できません。

そこで、日付をNumberFieldに変換して保存しておきます。

search.NumberField(name='sec', value=_get_sec(thread.create_date))


その上で、現在の日付で重み付けを行います。

now_sec=_get_sec(datetime.datetime.now())
reduct='(1+('+str(now_sec)+'-sec)/(3600*24*30))'; #一ヶ月で半分のスコアにする
search.SortExpression(expression='(bookmark_cnt*5+like_cnt)/'+reduct,
direction=search.SortExpression.DESCENDING, default_value=0)


これで、それなりにそれっぽい検索結果になります。

尚、デフォルトだと、検索条件を満たす1000件の範囲でのみソートが行われます。これだと、データ数が多くなると正常にソートできないため、SortOptionsのlimitプロパティを大きく設定することをオススメします。limit値は、最大で10000まで設定することができます。