我正在尝试将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()
))
)
答案 0 :(得分:0)
只是为了澄清分面不等于分组结果。 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。它会将构面信息添加到模板上下文中。