Skip to main content
 首页 » 编程设计

python之Django-haystack:如何在我的设置中启用突出显示

2024年08月29日26powertoolsteam

我目前正在使用 django-haystack v2.0.0-beta 向我的 Django 应用程序添加搜索功能和 Whoosh作为后端。到目前为止,创建索引并返回搜索结果工作正常。现在我想启用突出显示功能,但我没有让它工作。

我使用的是高度自定义的设置,haystack 文档对此帮助不大。我的 Django 应用程序是一个纯 AJAX 应用程序,即客户端和服务器之间的所有请求都使用 jQuery 和 $.ajax() 异步处理。这就是为什么我编写了一个自定义 Django View ,它手动创建 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 

表单.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': ['']}

任何人都可以帮助我使突出显示功能正常工作吗?非常感谢您。

请您参考如下方法:

看起来这可能是一个长期 Unresolved Haystack 错误: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用于文档。