搜索和排名结果

时间:2009-09-23 20:48:16

标签: sql search activerecord ranking

我正在尝试编写相对简单算法来搜索多个属性上的字符串

给出一些数据:

一些数据:

1: name: 'Josh', location: 'los angeles'
2: name: 'Josh', location: 'york'

搜索字符串:“josh york”

结果应为[2,1],因为查询字符串两次击中第二条记录,第一条记录一次。

在这里假设不区分大小写是安全的。

所以这就是我目前所拥有的,在ruby / active record中:

query_string = "josh new york"
some_attributes = [:name, :location]

results = {}
query_string.downcase.split.each do |query_part|
  some_attributes.each do |attribute|
    find(:all, :conditions => ["#{attribute} like ?", "%#{query_part}%"]).each do |result|
      if results[result]
        results[result] += 1
      else
        results[result] = 1
      end
    end
  end
end

results.sort{|a,b| b[1]<=>a[1]}

我对这个方法的问题是它产生了大量的查询(query_string.split.length * some_attributes.length)。

我可以通过减少查询次数以某种方式提高效率吗?

我可以在ruby中进行排序,但是如果可以某种方式将它塞进SQL中那也很好。

1 个答案:

答案 0 :(得分:0)

为什么不使用Ferret之类的内容? Ferret是一个Ruby + C扩展,可以创建全文索引。由于您似乎使用的是ActiveRecord,因此还有acts_as_ferret