我很难在搜索表单中使用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?
答案 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