如何在Django中对Haystack搜索结果进行分组

时间:2013-10-14 21:09:15

标签: python django django-haystack whoosh

我正在尝试将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()
    ))
)

1 个答案:

答案 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。它会将构面信息添加到模板上下文中。