使用Django中的全文搜索(Full Text Search)实现搜索建议(Suggestions)功能

2023-04-11 00:00:00 功能 建议 全文

要在Django中实现搜索建议功能,您需要使用Django中的全文搜索功能。Django中可以使用多种数据库引擎来实现全文搜索功能,其中包括PostgreSQL,MySQL,以及SQLite等。

以下是使用PostgreSQL作为数据库引擎的搜索建议功能的代码示例:

  1. 安装PostgreSQL和django.contrib.postgres:
pip install psycopg2 django.contrib.postgres
  1. 在settings.py中配置DATABASES和INSTALLED_APPS:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'your-database-username',
        'PASSWORD': 'your-database-password',
        'NAME': 'your-database-name',
        'HOST': 'localhost',
        'PORT': '',
    }
}

INSTALLED_APPS = [
    ...
    'django.contrib.postgres',
    ...
]
  1. 创建模型类并添加全文搜索字段:
from django.contrib.postgres.search import SearchVectorField
from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    search_vector = SearchVectorField(null=True, blank=True)

    def save(self, *args, **kwargs):
        self.search_vector = (
            SearchVector('title', weight='A') +
            SearchVector('content', weight='B')
        )

        super().save(*args, **kwargs)

在这个示例中,我们创建了一个名为“Blog”的模型,该模型具有标题和内容属性,以及一个名为“search_vector”的全文搜索向量。我们在保存数据时自动设置这个向量,它包含了标题和内容字段的所有文本。

  1. 创建视图并添加搜索建议功能:
from django.contrib.postgres.search import SearchQuery, SearchRank
from django.http import JsonResponse
from django.views.generic import View

from .models import Blog


class SuggestView(View):
    def get(self, request):
        query = request.GET.get('query', '')
        limit = request.GET.get('limit', 5)

        search_query = SearchQuery(query)

        suggerstions = (
            Blog.objects
            .annotate(rank=SearchRank(F('search_vector'), search_query))
            .filter(search_vector=search_query)
            .order_by('-rank')[:limit]
        )

        results = list(suggestions.values('id', 'title', 'content'))

        return JsonResponse({'results': results})

在这个示例中,我们创建了一个名为“SuggestView”的视图,它使用SearchQuery和SearchRank计算查询与每个博客条目的相关性。我们过滤出与查询相关的博客条目,并按相关性降序排列。最后,我们将结果作为JSON响应返回。

在前端,您可以通过Ajax请求调用这个视图,以获取搜索建议。

例如,在搜索框中键入“pidancode.com”,这个视图将返回所有标题或内容包含“pidancode.com”的博客文章,并按相关性降序排列。

希望这个代码示例对您有所帮助!

相关文章