条件order_by取决于太阳黑子中的数据

时间:2013-03-25 14:38:19

标签: ruby-on-rails solr sunspot

我想知道是否有一种方法可以使用某种if/then语义对排序顺序进行排序。

我试图解决的基本要求是:

  • 我的记录有一个contact_again_time时间属性,可以是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索引中。

我宁愿避免的东西,因为它感觉相当错误。

1 个答案:

答案 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