Django全文检索(Full Text Search)的最佳实践
Django中的全文检索可以利用第三方库实现,比如Haystack和Elasticsearch。下面以Haystack为例,讲解Django全文检索的最佳实践。
- 安装Haystack和搜索引擎后端
在settings.py中设置搜索引擎后端。常见的搜索引擎有solr、whoosh和elasticsearch,这里以elasticsearch为例。
INSTALLED_APPS = [ # ... 'haystack', ] HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://localhost:9200/', 'INDEX_NAME': 'my_index', }, }
- 定义搜索索引
定义一个搜索索引来说明哪些模型字段是可以被搜索的。索引者负责自动将内容索引插入到搜索引擎中,同时定义哪些字段需要被搜索。
比如,想在一个名为Blog的模型上执行全文搜索。在app下创建search_indexes.py文件,定义一个BlogIndex类。
import datetime from haystack import indexes from .models import Blog class BlogIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) pub_date = indexes.DateTimeField(model_attr='pub_date') def get_model(self): return Blog def index_queryset(self, using=None): return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now())
- 创建一个模板来渲染被索引的文本
在templates/search/indexes/app_name/model_name/下,创建一个名为model_name_text.txt的文件。这个文件将被用来渲染索引文本。
比如在app下创建templates/search/indexes/blog/blog_text.txt文件,其中{{ object.title }}、{{ object.body }}分别是要被搜索的字段。
{{ object.title }} {{ object.body }}
- 在views.py中实现搜索功能
from django.shortcuts import render from haystack.query import SearchQuerySet def search(request): query = request.GET.get('q') results = SearchQuerySet().filter(text__contains=query) return render(request, 'search/search.html', { 'query': query, 'results': results, })
- 创建搜索页面
在templates/search/search.html文件中展示搜索结果。
{% extends "base.html" %} {% block content %} <h1>Search results for "{{ query }}"</h1> <ul> {% for result in results %} <li><a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a></li> {% empty %} <p>No results found.</p> {% endfor %} </ul> {% endblock %}
- 添加索引
在django shell中添加索引。
python manage.py shell from haystack.management.commands import update_index update_index.Command().handle()
以上是Django全文检索的最佳实践,可以根据实际需求定制索引和搜索结果页面。
相关文章