我想知道是否有一种方法可以使用某种if/then
语义对排序顺序进行排序。
我试图解决的基本要求是:
nil
。contact_again_time
的记录首先按contact_again_time
降序排列。contact_again_time
为零的其余部分应由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索引中。
我宁愿避免的东西,因为它感觉相当错误。
答案 0 :(得分: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
的文档,就像您在下面的评论中提到的那样。要将这些文档推送到最后,请在Solr schema.xml中将sortMissingLast="true"
添加到contact_again_time
。如果某些文档中也可能缺少created_at
,并且您希望获得相同的行为,则还应向其添加sortMissingLast
。