Django全文检索(Full Text Search)的最佳实践

2023-04-11 00:00:00 实践 检索 全文

Django中的全文检索可以利用第三方库实现,比如Haystack和Elasticsearch。下面以Haystack为例,讲解Django全文检索的最佳实践。

  1. 安装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',
    },
}
  1. 定义搜索索引

定义一个搜索索引来说明哪些模型字段是可以被搜索的。索引者负责自动将内容索引插入到搜索引擎中,同时定义哪些字段需要被搜索。

比如,想在一个名为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())
  1. 创建一个模板来渲染被索引的文本

在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 }}
  1. 在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,
    })
  1. 创建搜索页面

在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 %}
  1. 添加索引

在django shell中添加索引。

python manage.py shell
from haystack.management.commands import update_index
update_index.Command().handle()

以上是Django全文检索的最佳实践,可以根据实际需求定制索引和搜索结果页面。

相关文章