2009-09-23 172 views
0

我想寫一個相對簡單的算法搜索字符串的幾個屬性搜索和排名結果

給出了一些數據:

一些數據:

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

搜索字符串:「josh york」

結果應該是[2,1],因爲該查詢字符串會兩次擊中第二條記錄,並且第一個r ecord一次。

這裏假設不區分大小寫是安全的。

所以這裏是我到目前爲止,在紅寶石/活動記錄:

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。長度)。

我可以通過減少查詢次數嗎?

我很喜歡在ruby中進行排序,雖然如果這可以以某種方式堵塞到SQL中,那也不錯。

回答

0

爲什麼不使用類似Ferret的東西? Ferret是一個Ruby + C擴展,用於創建全文索引。由於您似乎使用ActiveRecord,因此還有acts_as_ferret

+0

我想任何「全功能」的文本搜索「引擎」是矯枉過正的搜索一個表中的兩列。在這裏尋求簡單/輕量。 – jsharpe 2009-09-24 14:19:14