3

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

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

  • 我的记录有一个 contact_again_time 时间属性,可以是nil.
  • 列表的排序方式应使所有具有contact_again_time优先顺序的记录按contact_again_time降序排列。
  • 其余contact_again_time为 nil 的位置应按 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首先丢失的文件,就像你在下面的评论中提到的那样。要将这些文档推送到最后,请添加sortMissingLast="true"contact_again_time您的 Solr schema.xml。如果created_at某些文档中也可能不存在并且您希望具有相同的行为,那么您也应该添加sortMissingLast它。

于 2013-03-26T02:02:50.003 回答