2009-09-23 7 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을 생산한다는 것입니다. 길이).

어쨌든 에 의해 더 효율적으로 만들 수 있습니까??

루비 내에서 정렬해도 문제가 없지만 SQL에 너무 복잡해지면 괜찮습니다.

답변

0

Ferret과 같은 것을 사용하지 않는 이유는 무엇입니까? 흰 족제비는 전체 텍스트 색인을 만들기위한 Ruby + C 확장 프로그램입니다. ActiveRecord를 사용하고있는 것 같기 때문에 acts_as_ferret도 있습니다.

+0

"모든 기능을 갖춘"텍스트 검색 "엔진"은 한 테이블에서 두 개의 열을 검색 할 때 과도하다고 생각합니다. 여기에 간단한/가벼운 무게로 간다. – jsharpe