使用Haystack构面提供多个搜索字段

时间:2014-09-22 05:47:10

标签: django elasticsearch django-haystack

我正在编写一个简单的图书馆应用程序(目前只是一个图书数据库),我有一个Haystack搜索页面作为主页。我正在尝试向页面添加多个搜索字段,因此您可以专门搜索标题,作者等,而不只是一个通用的“关键字”搜索。我一直在尝试使用Haystack的“faceting”功能,但它似乎更倾向于根据给定的严格类别改进搜索。

您可以使用Haystack构面提供多个搜索字段吗?或者Haystack是不是因为这种工作而被裁掉了?如果是这样,我应该使用什么呢?

如果您需要更多上下文,则当前项目为available on GitHub

1 个答案:

答案 0 :(得分:2)

尝试使用ModelSearchForm。此表单添加了要创建的新字段。它遍历当前SearchSite的所有已注册模型,并为每个模型提供一个复选框。如果未选择任何模型,则所有类型都将显示在结果中。

来自文档的

自定义表单示例,可以从ModelSearcForm简单地转换为ModelSearchForm

from django import forms
from haystack.forms import SearchForm


class DateRangeSearchForm(SearchForm):
start_date = forms.DateField(required=False)
end_date = forms.DateField(required=False)

def search(self):
    # First, store the SearchQuerySet received from other processing.
    sqs = super(DateRangeSearchForm, self).search()

    if not self.is_valid():
        return self.no_query_found()

    # Check to see if a start_date was chosen.
    if self.cleaned_data['start_date']:
        sqs = sqs.filter(pub_date__gte=self.cleaned_data['start_date'])

    # Check to see if an end_date was chosen.
    if self.cleaned_data['end_date']:
        sqs = sqs.filter(pub_date__lte=self.cleaned_data['end_date'])

    return sqs

DateRange SearchForm是一种自定义表单,具有更大的灵活性,因为它可以更好地控制开发人员。创建自己的表单最简单的方法是从SearchForm(或所需的父级)继承并扩展搜索方法。通过这样做,您可以节省大部分正确处理数据的工作,并保持与SearchView的API兼容。

此问题可以提供更多帮助django haystack custom form