我正在使用轮胎对具有类别属性的对象组进行搜索(有6种不同的类别) 我希望结果以页面6的形式出现在页面上的每个类别中的一个(尽管可能)。
为Eg1。因此,如果第一,第二和第三类每个都有2个对象,第四个,第五个和第六个类别各有1个对象,每个页面看起来像:
数据:[1,1,2,2,3,3,4,5,6]
1:1,2,3,4,5,6
2:1,2,3
为Eg2。 [1,1,1,1,1,2,2,3,4,5]
1:1,2,3,4,5,1
2:2,1,1,1
在像ruby这样的东西中,根据数字出现的次数排序并不太难。
像
这样的东西times_seen = {}
results.sort_by do |r|
times_seen[r.category] ||= 0
[times_seen[r.category] += 1, r.category]
end
E.g。
irb(main):032:0> times_seen = {};[1,1,1,1,1,2,2,3,4,5].sort_by{|i| times_seen[i] ||= 1; [times_seen[i] += 1, i];}
=> [1, 2, 3, 4, 5, 1, 2, 1, 1, 1]
使用大量结果执行此操作会非常慢,因为我们需要首先将它们全部拉入ruby然后排序。
理想情况下,我们希望在弹性搜索中执行此操作,并让它为我们处理分页。
弹性搜索中有基于脚本的排序: http://www.elasticsearch.org/guide/reference/api/search/sort/
{
"query" : {
....
},
"sort" : {
"_script" : {
"script" : "doc['field_name'].value * factor",
"type" : "number",
"params" : {
"factor" : 1.1
},
"order" : "asc"
}
}
}
因此,如果我们可以做类似这样的事情,但是在其中有上面的times_seen逻辑,它会让生活变得非常简单,但是它需要在脚本之间保持一个times_seen变量。
有关如何基于属性实现统一分发的任何想法,或者是否有可能以某种方式在脚本排序中使用变量?