Sunspot Solr — работа с гранями

Я настроил фасетный поиск с помощью Sunspot, SOLR. Нравится:

for row in @search.facet(:facet_id).rows
    link_to row.instance.name, :url_for(:search => params[:q], :facet_id => row.value)

Моя проблема в том, что когда я выполняю многогранный поиск в контроллере следующим образом:

    @search = Sunspot.search(MyModel) do
      keywords search_text 
      facet    :facet_id
      with(:facet_id, params[:facet_id]) if params[:facet_id].present?
    end

Количество фасетов теперь рассчитывается на основе условия with(:facet_id, params[:facet_id]). Я хочу, чтобы количество граней ВСЕГДА рассчитывалось без этого условия.

Нужно ли мне выполнять два поиска? Один для поиска без условий (для подсчета количества фасетов) и один с условием для получения результатов. Или есть способ сделать это в одном запросе SOLR.

Спасибо

Хэмиш


person Hamish    schedule 15.06.2011    source источник


Ответы (1)


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

Sunspot.search(MyModel) do
  facet_restriction = with(:facet_id, params[:facet_id])
  facet(:facet_id, :exclude => facet_restriction)
end

Надеюсь, это поможет.

person outoftime    schedule 16.06.2011
comment
Есть ли простой способ получить грань «все»? потому что @search.total не исключает аспект из своего расчета. Благодарность - person Hamish; 17.06.2011
comment
Существует возможность всех аспектов, но Sunspot использует Solr Query Facets под капотом для его вычисления, и (в моих экспериментах) аспекты запросов не работают должным образом с множественным выбором, хотя в документах говорится, что они должны. Однако это может быть исправлено в Solr 3.1, поэтому, если вы нацелены на 3.1, попробуйте (это вариант :extra для метода facet Sunspot). - person outoftime; 17.06.2011