Пользовательская сортировка значений аспектов Solr — Rails & Sunspot Solr

Я использую 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)

person heading_to_tahiti    schedule 19.08.2013    source источник


Ответы (1)


Как вы упомянули, Solr принимает только два значения сортировки для фасетов: количество (количество результатов) и индекс (лексикографический). Предполагая, что вы не хотите изменять проиндексированные данные, у вас есть две альтернативы: отсортировать массив фасетов вручную или создать пользовательский фасет запроса. Я бы выбрал первое, так как у вас очень ограниченный набор результатов.

Ручная сортировка

# 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
person polmiro    schedule 20.08.2013
comment
Спасибо, это сработало отлично! Я выбрал подход с аспектом запроса, так как не смог заставить ручную сортировку работать должным образом (ошибка - сравнение NilClass с 2 не удалось). Я бы +1 вам здесь, но, поскольку я новичок в переполнении стека, это пока не позволит мне. - person heading_to_tahiti; 21.08.2013
comment
Я предполагаю, что у некоторых продуктов не будет размера, поэтому индекс будет нулевым, и сравнение не удастся. Но рад слышать, что другая альтернатива сработала. - person polmiro; 16.09.2014