基于属性在弹性搜索中均匀分布结果

时间:2013-09-06 11:01:48

标签: elasticsearch tire

我正在使用轮胎对具有类别属性的对象组进行搜索(有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变量。

有关如何基于属性实现统一分发的任何想法,或者是否有可能以某种方式在脚本排序中使用变量?

0 个答案:

没有答案