我正在使用轮胎对具有类别属性的对象集执行搜索(有 6 个不同的类别)。
我希望结果以 6 页的形式出现,每个类别在一个页面上都有一个(尽管有可能)。
例1。因此,如果第一、二、三类各有 2 个对象,而第四、五、六类各有 1 个对象,则页面将如下所示:
数据:[1,1,2,2,3,3,4,5, 6]
1: 1,2,3,4,5,6
2: 1,2,3
例2。[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
例如
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 变量。
关于如何基于属性实现均匀分布或者是否可以在脚本排序中以某种方式使用变量的任何想法?