我正在尝试编写相对简单算法来搜索多个属性上的字符串
给出一些数据:
一些数据:
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中那也很好。
答案 0 :(得分:0)
为什么不使用Ferret之类的内容? Ferret是一个Ruby + C扩展,可以创建全文索引。由于您似乎使用的是ActiveRecord,因此还有acts_as_ferret。