2013-08-19 5 views
2

나는 Sunspot Solr을 사용하여 패싯으로 검색합니다. 그러나 패싯 값을 순서대로 정렬하여 표시하려고 할 때 문제가 발생합니다. 내 제품의 크기는 (S, M, L, XL, XXL)이거나 일부 제품의 경우 신발 크기 (8, 9, 10, 11, 12, 13)와 같은 크기 일 수 있습니다. facet.sort 메소드를 'index'로 설정할 때 문자열 값을 알파벳순으로 놓습니다. 결과는 각각 [L, M, S, XL, XXL] 및 [10, 11, 12, 8, 9]가됩니다. 이러한 목표를 달성하기 위해 사용자 지정 정렬 방법을 달성하기위한 좋은 방법은 무엇입니까?Solst 패싯 값의 사용자 지정 정렬 - 레일 및 태양 흑점 솔

내 콘트롤 :

내보기
@search = Product.search do 
    fulltext params[:search] 
    facet(:size, :sort => :index) 
    with(:size, params[:size]) if params[:size].present? 
end 

: 당신이 말한 것처럼이 정렬

SIZE 
L (10) 
M (10) 
S (10) 
XL (10) 
XXL (10) 

답변

3

표시됩니다 결과

<% for row in @search.facet(:brand).rows %> 
    <li> 
     <% if params[:brand].blank? %> 
      <%= link_to link_to "#{row.value} (#{row.count})", params.merge({:brand => row.value}) %> 
     <% else %> 
      <strong><%= row.value %></strong> (<%= link_to "remove", params.merge({:brand => nil}) %>) 
     <% end %> 
    </li> 
<% end %> 

는, SOLR는 측면 두 종류의 값을 받아, 카운트 (결과 수) 및 인덱스 (사전 식). 인덱싱 된 데이터를 변경하지 않으려는 경우, 패싯 배열을 수동으로 정렬하거나 사용자 지정 쿼리 패싯을 만드는 두 가지 방법이 있습니다. 나는 당신이 매우 제한된 패싯 결과를 가지고 있기 때문에 전자를 선택할 것입니다.

매뉴얼 종류의

@search = Product.search do 
    fulltext params[:search] 
    facet(:size) do 
    row('S') { with(:size, 'S') } 
    row('M') { with(:size, 'M') } 
    row('L') { with(:size, 'L') } 
    row('XL') { with(:size, 'XL') } 
    row('XXL') { with(:size, 'XXL') } 
    end 
    with(:size, params[:size]) if params[:size].present? 
end 
+0

감사

# supposing these are your possible sizes SCALE = %w(S M L XL XXL) # once you perform your search sort based on the scale order @search.facet(:size).rows.sort_by! { |r| scale.index(r.value) } 

쿼리면, 이것은 좋은 일! 나는 수동 정렬을 제대로 수행 할 수 없기 때문에 Query 패싯 접근법을 선택했습니다 (NilClass와 2의 오류 비교가 실패했습니다). 나는 여기에 +1 하겠지만 스택 오버플로를 새로 할 때 아직 나를 허용하지 않을 것입니다. –

+0

내 생각에 일부 제품에는 크기가 없으므로 인덱스가 null이되어 비교가 실패합니다. 그러나 다른 대안을 듣고 기뻤습니다. – polmiro