【问题标题】:Django-haystack: How to enable highlighting in my setup?Django-haystack:如何在我的设置中启用突出显示?
【发布时间】:2012-12-20 15:20:44
【问题描述】:

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

我正在使用高度定制的设置,而 haystack 文档对此没有太大帮助。我的 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')

只要搜索结果正确返回,此代码就可以正常工作。但是当我尝试访问突出显示的文本 sn-p 以获取搜索结果时,例如第一个:

print search_results[0].highlighted

然后我总是得到一个空字符串作为结果:{'text': ['']}

谁能帮我让突出显示功能正常工作?非常感谢您。

【问题讨论】:

标签: python django django-haystack


【解决方案1】:

看起来这可能是一个长期未解决的 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

【讨论】:

  • 确实,我应该先浏览 GitHub 上的未解决问题。那显然不是我的错。我刚刚试用了 Haystack 的突出显示功能,效果很好。所以我会同意的。再次,非常感谢,艾米丽! :)
【解决方案2】:

我不熟悉 Haystack,但可能是因为您在一个地方使用 HaystackSearchForm 而在另一个地方使用 HighlightedSearchForm

【讨论】:

  • 可能,但我现在不这么认为,因为搜索结果返回正确。如果您知道一种仅使用 HighlightedSearchForm 完成相同操作的方法,我很好奇。
  • SearchForm 相同,但增加了突出显示,请阅读HighlightedSearchForm 文档。
  • 你不说。 ;) 我已经这样做了。如果它对我有帮助,我就不会在这里问了。
  • 实际上,Haystack 提供了您的表单应该继承的表单,而不是 forms.form。我想你想要HighlightedSearchForm
猜你喜欢
  • 2018-03-10
  • 2018-06-05
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多