2010-01-24 3 views
0

나는 a Ruby on Rails site에 대해 생각하고있는 스핑크스를 사용하여 postgres 데이터베이스를 검색합니다.스핑크스에서 부울 필드를 문자열로 인덱싱

내가 검색 할 테이블의 필드 중 하나가 부울입니다. 특정 키워드가 검색 쿼리에 사용될 때 해당 부울을 일치시킬 수 싶습니다.

예를 들어 완전히 설명하려면 다음을 수행하십시오.
내 사이트는 자신의 흑백 필름을 개발 한 사람들을위한 사이트입니다.
사람들이 필름을 어떻게 개발하는지 설명하는 레서피 테이블이 있습니다. 이 테이블에는 "stand_developed"라는 부울 열이 있습니다 (필름 개발 방법).
사용자가 단어 "스탠드"를 검색 할 때 해당 필드가 참인 결과를 반환하고 싶습니다.

나는 가능하다면 sphinx docs을 거쳤으며 실제로 발견되지 않았습니다.

쿼리 조건을 구문 분석하고 조건을 추가하여 컨트롤러 메서드 내부를 해킹 할 수 있다고 생각하지만이를 수행하는 더 깨끗한 방법이 있습니까?

답변

0

나는이 문제에 대한 해결책을 제시했다.

나는 "stand"라는 단어를 파싱하고 명시 적으로 (Paul Davis의 답을 변형 한) "내 생각에"말했던 "해킹"을 시도했지만 제대로 작동하지 않았습니다.

나는 내 질문에 이것을 설명하지 않았지만 (내가 묻는 당시의 모든 의미를 알지 못했다) 사용자가 자신의 제조법 설명에도 "스탠드"라는 단어를 사용하면 일치해야합니다.

그래서 스핑크스가 "stand_developed가 true이거나 노트에 '스탠드'가 포함되어 있지만"올바른 구문을 찾을 수없는 경우 "라는 라인을 따라 조건을 추가하려고했습니다. 또한 다른 검색 텍스트도 처리해야했습니다.

"레시피를 추가 할 때 사용자가"stand_developed "를 선택하면"search_tags "라는 레서피 테이블에 추가 열을 추가하고"stand "라는 단어를 추가합니다. 그런 다음 스핑크스는 해당 필드와 다른 필드를 색인화하여 모두 완벽하게 작동합니다.

1

이것은 내가 생각하는 부울 필드에서 ThinkingSphinx를 사용하여 검색 한 것입니다.

stand_developed의 검색없이 일반적인 쿼리에 대한
  1. URL 쿼리에 대한 http://yoursite.com/search?q=your_query_string&stand_developed=1
  2. URL 될 것 stand_developed == TRUE와 쿼리에 대한 http://yoursite.com/search?q=your_query_string
  3. URL 될 것입니다 : 다음과 같은 방법으로 QUERY_STRING와 함께 URL 매개 변수로 stand_developed 전달 stand_developed == FALSE와 그런 http://yoursite.com/search?q=your_query_string&stand_developed=0

될 것입니다, 컨트롤러, 당신은이 작업을 수행 할 것입니다 :

if params[:stand_developed] && params[:stand_developed].to_i == 1 
    # perform query search with stand_developed == true 
    @search_results = YourModel.search(params[:q], :with => {:stand_developed => true}) 
elsif params[:stand_developed] && params[:stand_developed].to_i == 0 
    # perform query search with stand_developed == false 
    @search_results = YourModel.search(params[:q], :with => {:stand_developed => false}) 
else 
    # perform general query search 
    @search_results = YourModel.search(params[:q]) 
end 
1

params [: search]에 'stand'라는 텍스트가 포함되어 있는지 테스트 한 다음 거기에서 검색을 완료 할 수 있습니다. 테이블에 여분의 열이 필요하지 않습니다. 단지 오버 헤드가 필요하지 않습니다.

if params[:search].downcase.include?('stand') 
    Model.search params[:search], :with => {:stand_developed => true} 
else 
    Model.search params[:search] 
end 
관련 문제