使用Django Haystack自动完成

时间:2013-01-13 21:28:31

标签: django autocomplete routing django-haystack

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

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?

1 个答案:

答案 0 :(得分:1)

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

通过覆盖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

现在,我们会在SearchQuerySet字段上的表单first_name_auto上执行过滤,而不是auto_query字段上通常执行的text过滤(请参阅{{ 1}}看看原始搜索功能是什么样的。)

您指定要在参数列表中将此表单用于haystack/forms.py

search_view_factory