使用Django中的全文搜索(Full Text Search)扩展你的应用程序

2023-04-11 00:00:00 应用程序 扩展 全文

在Django中,我们可以使用第三方库来实现全文搜索功能。其中比较流行的有两个库:Haystack和Django Full Text Search。

下面演示如何使用Django Full Text Search来实现全文搜索功能:

  1. 安装Django Full Text Search:
pip install django-fulltext-search
  1. 在settings.py中添加以下配置:
INSTALLED_APPS = [
    ...
    'django_fulltext_search',
]

FULLTEXT_SEARCH_RESULT_LIMIT = 20 # 搜索结果最大数量,可选配置
  1. 在models.py中定义需要搜索的模型类,如:
from django.db import models
from django_fulltext_search import FullTextSearchMixin

class BlogPost(FullTextSearchMixin, models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

其中,需要使用FullTextSearchMixin来添加全文搜索功能。

  1. 执行数据库迁移操作:
python manage.py makemigrations
python manage.py migrate
  1. 在views.py中添加搜索视图:
from django.views.generic import ListView
from django_fulltext_search.controller import SearchListMixin
from .models import BlogPost

class SearchResultsView(SearchListMixin, ListView):
    model = BlogPost
    template_name = 'search_results.html'
    paginate_by = 10
    search_fields = ['title', 'content']

其中,我们使用SearchListMixin来添加搜索功能。需要指定model,search_fields(需要搜索的字段),template_name和paginate_by等参数。

  1. 在urls.py中添加搜索路由:
from django.urls import path
from .views import SearchResultsView

urlpatterns = [
    path('search/', SearchResultsView.as_view(), name='search_results'),
]
  1. 在templates中添加搜索页面,如search_results.html:
{% extends 'base.html' %}

{% block content %}
    {% if query %}
        <h2>Search results for "{{ query }}"</h2>
        {% if object_list %}
            {% for post in object_list %}
                <div class="post">
                    <h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
                    <p>{{ post.content|truncatechars:200 }}</p>
                </div>
            {% endfor %}
            {% if page_obj.has_previous %}
                <a href="?q={{ query }}&page={{ page_obj.previous_page_number }}">previous</a>
            {% endif %}
            <span class="current-page">{{ page_obj.number }}</span>
            <span class="total-pages">{{ page_obj.paginator.num_pages }}</span>
            {% if page_obj.has_next %}
                <a href="?q={{ query }}&page={{ page_obj.next_page_number }}">next</a>
            {% endif %}
        {% else %}
            <p>No results found.</p>
        {% endif %}
    {% endif %}
{% endblock %}

其中,我们展示了搜索结果,并使用了分页功能。

  1. 在模板中添加搜索表单,如base.html:
{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <nav>
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="{% url 'search_results' %}">Search</a></li>
        </ul>
    </nav>
    <div class="container">
        <form method="GET" action="{% url 'search_results' %}">
            <input type="text" name="q" placeholder="Search...">
            <button type="submit">Go</button>
        </form>
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

在表单中添加了搜索框和提交按钮。

  1. 启动Django服务器,测试搜索功能。

以上就是使用Django Full Text Search实现全文搜索功能的全部过程。如果使用字符串作为范例,可以搜索“pidancode.com”或“皮蛋编程”来测试搜索效果。

相关文章