Как сгруппировать результаты поиска Haystack в Django

Я пытаюсь сгруппировать результаты поиска из Haystack. Я хочу, чтобы они были сгруппированы по модели (художник или картина), затем по полю даты (создано), а в идеале по логическому полю (продано).

т.е. что-то вроде следующего, но это не работает. Я думаю, мне нужно переопределить SearchView и каким-то образом обработать запрос, прежде чем он будет передан шаблону, но я не уверен, как это сделать.

Или, может быть, я должен просто делать группировку в шаблоне?

def get_queryset():
    q = SearchQuerySet().filter(display=True).order_by('-created')

    paintings_unsold = q.models(Painting).filter(sold=False)
    paintings_sold = q.models(Painting).filter(sold=True)
    artists = q.models(Artist)

    return paintings_unsold | paintings_sold | artists


urlpatterns += patterns(
    '',
    (r'^search/', SearchView(
         searchqueryset=get_queryset()
    ))
)

person eggbert    schedule 14.10.2013    source источник
comment
Не уверен, что вы подразумеваете под группой. Набор результатов поиска представляет собой список элементов. Может быть, вы имели в виду "грани"?   -  person Hamish    schedule 15.10.2013
comment
Думаю, я имею в виду, что вместо того, чтобы возвращать результаты поиска в порядке релевантности (которым я полагаю, они являются по умолчанию), я хочу вернуть их по базовому типу модели, а затем по логическому атрибуту этой модели.   -  person eggbert    schedule 15.10.2013
comment
Все еще не уверен, что вы имеете в виду. Вы говорите о порядке сортировки, который сильно отличается от группировки.   -  person Hamish    schedule 16.10.2013
comment
почему бы просто не сделать 3 запроса?   -  person dalore    schedule 24.03.2014
comment
Я чувствую, что огранка даст вам группы, которые вы ищете. Хотя я не знаю, как ты мог такое заказать. Кажется, это противоречит природе результатов поиска. Вы можете усилить определенные поля, чтобы при сопоставлении с этим полем они отображались выше в результатах поиска. Однако это больше похоже на то, что вы хотите сделать фильтр, а затем сделать несколько order_bys.   -  person user133688    schedule 23.05.2014


Ответы (1)


Просто чтобы уточнить, что фасетирование не равно группировке результатов. SOLR может сделать это, например (версия 4): https://cwiki.apache.org/confluence/display/solr/Result+Grouping.

Но то, о чем вы на самом деле просите, это огранка, как упоминалось в комментариях:

http://django-haystack.readthedocs.org/en/v2.4.0/faceting.html https://cwiki.apache.org/confluence/display/solr/Faceting

Я дам ответ SOLR, даже несмотря на то, что вопрос помечен Whoosh. Может еще поможет.


Вы хотите фасетировать поле sold и поле artist_exact, которые вам, вероятно, придется создать. Он должен быть типа string, иначе ваши грани будут выглядеть странно.

Итак, ваше текущее поле artist, вероятно (рекомендуется) является текстовым полем, которое каким-то образом токенизирует ввод. Просто добавьте новое поле, которое не токенизируется, и директиву копирования в schema.xml, которая копирует исполнителя в это новое поле.

<field name="artist" type="text_general" indexed="true" stored="true"/>
<field name="artist_exact" type="string" indexed="true" stored="false"/>
<copyField source="artist" dest="artist_exact" />

В solrconfig.xml добавьте в обработчик поиска следующие параметры:

<str name="facet">on</str>
<str name="facet.field">sold</str>
<str name="facet.field">artist_exact</str>

Haystack предоставляет FacetedSearchView, который вы можете использовать. Это добавит информацию о фасете в контекст шаблона.

person Risadinha    schedule 20.07.2015