如何使用Django Haystack实现全文检索(Full Text Search)
Django Haystack是Django的全文检索框架,它可以与多种搜索引擎集成,包括Solr、Elasticsearch和Whoosh等。下面将介绍如何使用Django Haystack和Whoosh搜索引擎实现全文检索。
- 安装Django Haystack和Whoosh
pip install django-haystack pip install Whoosh
- 在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用于在模型保存时实时更新索引。
- 在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两个参数,表示使用模板来定义文本内容。
- 创建haystack_templates/myapp/mymodel_text.txt文件,其中myapp和mymodel分别为app名称和模型名称,文件内容如下:
{{ object.title }} {{ object.body }}
这里定义了一个模板,包含了title和body两个字段的内容。
- 在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中。
- 创建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。
- 在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来进行搜索啦!
相关文章