我目前正在使用django-haystack v2.0.0-beta和Whoosh作为后端向我的Django应用程序添加搜索功能。到目前为止,创建索引并返回搜索结果工作正常。现在我想启用突出显示功能,但我不能让它工作。
我正在使用高度自定义的设置,干草堆文档不是很好的帮助。我的Django应用程序是一个纯AJAX应用程序,即客户端和服务器之间的所有请求都是使用jQuery和$.ajax()
异步处理的。这就是我编写自定义Django视图的原因,该视图手动创建haystack搜索查询集并将搜索结果转储到JSON对象中。所有这一切都很好,但增加突出显示不起作用。这是我到目前为止的代码:
search_indexes.py
class CrawledWebpageIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return CrawledWebpage # This is my Django model
forms.py
class HaystackSearchForm(forms.Form):
q = forms.CharField(
max_length=100,
label='Enter your search query')
views.py (我从this post采用了一些代码,因为它对我来说看起来很合理,但这可能是错误的)
def return_search_results_ajax(request):
haystack_search_form = HaystackSearchForm(request.POST)
response = {}
if haystack_search_form.is_valid():
search_query = haystack_search_form.cleaned_data['q']
sqs = SearchQuerySet().filter(content=search_query)
highlighted_search_form = HighlightedSearchForm(request.POST, searchqueryset=sqs, load_all=True)
search_results = highlighted_search_form.search()
# Here I extract those fields of my model that should be displayed as results
webpage_urls = [result.object.url for result in search_results[:10]]
response['webpage_urls'] = webpage_urls
return HttpResponse(json.dumps(response), mimetype='application/json')
只要正确返回搜索结果,此代码就可以正常工作。但是当我尝试访问搜索结果的突出显示的文本片段时,例如第一个:
print search_results[0].highlighted
然后我总是得到一个空字符串:{'text': ['']}
任何人都可以帮助我突出显示功能吗?非常感谢你提前。
答案 0 :(得分:3)
看起来这可能是一个长期未解决的干草堆错误:http://github.com/toastdriven/django-haystack/issues/310 http://github.com/toastdriven/django-haystack/issues/273 http://github.com/toastdriven/django-haystack/issues/582
作为替代方案,您可以使用Haystack的突出显示功能而不是Whoosh来自己突出显示结果。例如,一旦您在sqs
获得搜索结果,就可以
from haystack.utils import Highlighter
highlighter = Highlighter(search_query)
print highlighter.highlight(sqs[0].text)
获取第一个结果的突出显示文本。有关文档,请参阅http://django-haystack.readthedocs.org/en/latest/highlighting.html。
答案 1 :(得分:0)
我对Haystack并不熟悉,但可能是因为你在一个地方使用HaystackSearchForm
而在另一个地方使用HighlightedSearchForm
?