【问题标题】:Use Haystack facets to provide multiple search fields使用 Haystack facets 提供多个搜索字段
【发布时间】:2014-09-22 05:47:09
【问题描述】:

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

您可以使用 Haystack 构面来提供多个搜索字段吗?或者干草堆不适合这种工作?如果是这样,我应该改用什么?

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

【问题讨论】:

  • 您使用的是哪种搜索形式?
  • 模型搜索表​​单。此表单向表单添加新字段。它遍历当前 SearchSite 的所有注册模型,并为每个模型提供一个复选框。如果没有选择模型,所有类型都会显示在结果中。
  • @Mubasher 请将此扩展为答案,因为您显然应该得到赏金!
  • @Mubasher 另外,一个例子会很棒,因为我对 Django 很陌生。
  • @eliasah 我正在根据建议完全重新编写代码库。将尽快修复。

标签: django elasticsearch django-haystack


【解决方案1】:

试试 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(或所需的父级)继承并扩展搜索方法。通过这样做,您可以节省大部分正确处理数据的工作,并保持 API 与 SearchView 兼容。

更多帮助可以来自这个问题django haystack custom form

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2015-09-21
    相关资源
    最近更新 更多