3

if/thenソート順にある種のセマンティクスを使用してソートする方法があるかどうか疑問に思っています。

私が対処しようとしている基本的な要件は次のとおりです。

  • 私のレコードには、contact_again_time時間属性がありますnil
  • リストは、存在するすべてのレコードcontact_again_timeが最初にcontact_again_time降順で並べ替えられるように並べ替える必要があります。
  • 残りのcontact_again_timenilは、created_atで昇順で並べ替える必要があります。

ですから、頭のてっぺんから、次のsearchableように表示することで、注文フィールドをインデックスに具体化することで、これを解決できます。

integer :sort_key do                                                                                                                                             
  contact_again_time.nil? ? (created_at.to_i * -1) : contact_again_time.to_i                                                                                     
end

そして、order_by(:sort_key, :desc)私が欲しいものを手に入れるために。しかし、このようにして、ソートロジックの一部をモデル内に配置し、さらに重要なことにLuceneインデックス内に配置しています。

かなり気分が悪いので避けたいもの。

4

1 に答える 1

2

Solrでは、sortクエリにパラメータを 追加することでこれを行うことができます。sort=contact_again_time desc,created_at asc

存在する場合は常にcontact_again_time、降順で並べ替えられます(そして、created_at関係を断ち切るために使用されますが、これはあなたには関係ありません)。のみcreated_atが存在する場合、それらは昇順でソートされます。

これは、簡単な方法で黒点に変換されるはずです。

更新:以下のコメントで言及するように、最初に欠落sort=contact_again_time asc,created_at ascしているドキュメントを取得するように並べ替える場合。contact_again_timeこれらのドキュメントを最後までプッシュするには、Solrschema.xmlにに追加sortMissingLast="true"します。一部のドキュメントにも存在しない可能性があり、同じ動作が必要な場合は、それに追加する必要がcontact_again_timeあります。created_atsortMissingLast

于 2013-03-26T02:02:50.003 に答える