3

我很难让自动完成功能在搜索表单中使用 haystack 和 Solr。按照此处自动完成的说明,我能够通过以下方式创建我的索引。

class PersonIndex(indexes.RealTimeSearchIndex, indexes.Indexable):
    text = CharField(document=True, use_template=True)
    first_name = CharField(model_attr='first_name')
    last_name = CharField(model_attr='last_name')
    first_name_auto = indexes.EdgeNgramField(model_attr='first_name')


    def index_queryset(self):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all().order_by('first_name')

    def get_model(self):
        return Person

通过设置我的 URL 路由的方式,我没有定向到的查看请求,搜索方法有效。

url(r'^search/person/', search_view_factory(
    view_class=SearchView,
    template='index.html',
    form_class=ModelSearchForm
), name='haystack_search'),

说明说我们可以以这种方式执行查询

from haystack.query import SearchQuerySet

sqs = SearchQuerySet().filter(content_auto=request.GET.get('q', ''))

但是我们将这个 SearchQuerySet 放在哪里,我不确定要覆盖什么,如何修改我的 url 以正确路由。我的搜索目前以这种方式开箱即用,但我想尝试使用 EdgeNgramField 自动完成?

4

1 回答 1

1

您需要定义自己的自定义搜索表单并告诉它如何生成SearchQuerySet它返回给视图,然后告诉您search_view_factory使用该表单而不是ModelSearchForm.

SearchQuerySet通过覆盖ModelSearchForm搜索方法指定您希望生成视图使用的方式:

from haystack.forms import ModelSearchForm

class AutocompleteModelSearchForm(ModelSearchForm):

    def search(self):
        if not self.is_valid():
            return self.no_query_found()
        if not self.cleaned_data.get('q')
            return self.no_query_found()
        sqs = self.searchqueryset.filter(first_name_auto=self.cleaned_data['q'])

        if self.load_all
            sqs = sqs.load_all()

        return sqs

这现在将对表单的字段执行过滤器,SearchQuerySetfirst_name_auto不是auto_query通常在字段上执行的过滤器text(查看haystack/forms.py原始搜索功能的样子)。

您指定要在参数列表中使用此形式search_view_factory

from path.to.your.forms import AutocompleteModelSearchForm

url(r'^search/person/', search_view_factory(
    view_class=SearchView,
    template='index.html',
    form_class=AutocompleteModelSearchForm
 ), name='haystack_search'),
于 2013-01-15T21:51:12.827 回答