0

我正在尝试对来自 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()
    ))
)
4

1 回答 1

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。它可能仍然有帮助。


您想在字段soldartist_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。它将分面信息添加到模板上下文中。

于 2015-07-20T17:49:22.050 回答