如何使用Django Haystack实现全文检索(Full Text Search)

2023-04-11 00:00:00 检索 全文 如何使用

Django Haystack是Django的全文检索框架,它可以与多种搜索引擎集成,包括Solr、Elasticsearch和Whoosh等。下面将介绍如何使用Django Haystack和Whoosh搜索引擎实现全文检索。

  1. 安装Django Haystack和Whoosh
pip install django-haystack
pip install Whoosh
  1. 在settings.py中添加Haystack配置:
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    },
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

这里配置了一个名为"default"的搜索引擎,使用Whoosh引擎,并指定索引存储路径为项目根目录下的whoosh_index文件夹。RealtimeSignalProcessor用于在模型保存时实时更新索引。

  1. 在app的models.py中定义模型并继承SearchIndex和Indexable:
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from haystack import indexes
from .models import MyModel


class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return MyModel

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

这里定义了一个MyModelIndex,它包含一个CharField用于存储文本内容,并指定了document=True和use_template=True两个参数,表示使用模板来定义文本内容。

  1. 创建haystack_templates/myapp/mymodel_text.txt文件,其中myapp和mymodel分别为app名称和模型名称,文件内容如下:
{{ object.title }}
{{ object.body }}

这里定义了一个模板,包含了title和body两个字段的内容。

  1. 在app的views.py中实现搜索视图:
from django.shortcuts import render
from haystack.query import SearchQuerySet


def search(request):
    query = request.GET.get('q', '')
    results = []
    if query:
        search_results = SearchQuerySet().filter(text=query)
        for result in search_results:
            results.append(result.object)
    return render(request, 'search_results.html', {'results': results, 'query': query})

这里定义了一个search视图,首先获取查询关键字,然后查询SearchQuerySet,将结果逐一迭代,并将其object属性添加到结果列表中。最后将结果渲染到模板search_results.html中。

  1. 创建search_results.html模板:
{% if query %}
  <p>搜索结果:{{query}}</p>
  <ul>
    {% for result in results %}
      <li><a href="{{ result.get_absolute_url }}">{{ result }}</a></li>
    {% empty %}
      <p>没有找到相关内容。</p>
    {% endfor %}
  </ul>
{% endif %}

这里定义了一个ul列表,显示搜索结果,并提供get_absolute_url方法用于定位对象的URL。

  1. 在app的urls.py中添加搜索URL:
from django.urls import path
from . import views


urlpatterns = [
    path('search/', views.search, name='search'),
]

现在,我们已经可以使用Django Haystack和Whoosh搜索引擎实现全文检索了。我们可以在MyModel中添加一些记录,每个记录包含一个标题和正文,比如:

from django.db import models


class MyModel(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()

然后运行命令:

python manage.py rebuild_index

来构建索引。

最后我们可以通过访问http://127.0.0.1:8000/search/?q=pidancode.com来进行搜索啦!

相关文章