我正在使用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]。实现这些目标的实现自定义排序方法的好方法是什么?
我的控制器:
@search = Product.search do
fulltext params[:search]
facet(:size, :sort => :index)
with(:size, params[:size]) if params[:size].present?
end
我的观点:
<% 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 %>
显示的结果排序
SIZE
L (10)
M (10)
S (10)
XL (10)
XXL (10)
答案 0 :(得分:4)
正如您所提到的,Solr只接受facet,count(结果数)和index(lexicographic)两个排序值。假设您不想更改索引数据,则可以使用两种方法,手动对facet数组进行排序,或创建自定义查询方面。我会选择前者,因为你有一个非常有限的方面结果集。
手动排序
# 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) }
查询方面
@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