欢迎访问宙启技术站
智能推送

如何在Python中使用SearchVector()进行中文语义搜索

发布时间:2023-12-22 20:43:19

在 Python 中使用 SearchVector() 进行中文语义搜索,需要使用 Django 框架中的 django.contrib.postgres 模块提供的功能。该模块提供了对 PostgreSQL 数据库高级功能的支持,包括全文搜索功能。

1. 准备工作:

- 确保你已经安装了 Django 框架和 PostgreSQL 数据库,并且已经建立了一个项目和数据库连接。

- 在 settings.py 文件中,确保 'django.contrib.postgres' 在 INSTALLED_APPS 中被包含。

- 运行数据库迁移命令,以确保数据库模型已经同步。

2. 定义模型:

在 models.py 文件中定义一个模型,用于存储要进行中文语义搜索的内容。例如,我们创建一个名为 "Article" 的模型,其中包含一个 TextField 字段 "content",用于存储文章的内容。

   from django.db import models
   from django.contrib.postgres.search import SearchVector

   class Article(models.Model):
       content = models.TextField()

       search_vector = SearchVector('content', config='chinese')

       class Meta:
           indexes = [
               models.Index(fields=['search_vector'])
           ]
   

在上面的代码中,我们使用了 SearchVector() 函数来创建一个名为 "search_vector" 的矢量字段,用于存储文本的搜索矢量。我们还指定了一个名为 "chinese" 的配置,以指定中文的全文搜索配置。

注意:为了提高搜索性能,我们还添加了一个索引,以加快搜索操作。

3. 进行搜索:

在 views.py 文件中编写一个视图函数,用于接收用户的搜索请求,并执行中文语义搜索。

   from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
   from .models import Article

   def search_articles(request):
       query = request.GET.get('q')

       search_vector = SearchVector('content', config='chinese')
       search_query = SearchQuery(query, config='chinese')

       articles = Article.objects.annotate(
           rank=SearchRank(search_vector, search_query)
       ).filter(rank__gte=0.1).order_by('-rank')

       # 返回搜索结果到模板中
       return render(request, 'search_results.html', {'articles': articles})
   

在上面的代码中,我们首先获取用户输入的搜索关键字(假设通过 GET 请求参数 'q' 获取)。然后,我们创建一个 SearchVector 和 SearchQuery 对象,分别表示要搜索的字段和搜索的关键字。在查询中,我们还使用了 SearchRank() 函数来计算每个文章的搜索相关性得分。

最后,我们使用 annotate() 方法将相关性得分添加为名为 "rank" 的新字段,然后使用 filter() 方法根据得分来筛选搜索结果,并使用 order_by() 方法按得分降序排列。

4. 创建搜索表单:

在 templates 目录中创建一个名为 "search_form.html" 的 HTML 模板,用于显示搜索表单。

   <form action="." method="get">
       <input type="text" name="q" placeholder="输入搜索关键字">
       <button type="submit">搜索</button>
   </form>
   

在上面的代码中,我们使用 input 元素创建一个文本框,用于用户输入搜索关键字。然后,我们使用 button 元素创建一个按钮,用于提交搜索表单。

5. 显示搜索结果:

在 templates 目录中创建一个名为 "search_results.html" 的 HTML 模板,用于显示搜索结果。

   <h1>搜索结果</h1>

   {% if articles %}
       <ul>
           {% for article in articles %}
               <li>{{ article.content }}</li>
           {% endfor %}
       </ul>
   {% else %}
       <p>没有找到相关内容。</p>
   {% endif %}
   

在上面的代码中,我们首先显示一个标题 "搜索结果"。然后,我们使用 if-else 语句检查搜索结果是否为空。如果搜索结果不为空,我们使用 for 循环遍历每篇文章,并显示其内容。如果搜索结果为空,我们显示一条消息 "没有找到相关内容"。

6. 创建视图和 URL 映射:

在 urls.py 文件中创建一个 URL 映射,将搜索表单提交的请求导向搜索视图。

   from django.urls import path
   from .views import search_articles

   urlpatterns = [
       path('', search_articles, name='search_articles'),
   ]
   

在上面的代码中,我们将根 URL 绑定到 search_articles 视图函数。

现在,你可以通过访问你的网站,输入搜索关键字并提交搜索表单,来执行中文语义搜索。搜索结果会显示在搜索结果页面上。

以上是在 Python 中使用 SearchVector() 进行中文语义搜索的简单示例。你可以根据自己的需求和数据库模型进行相应的修改和优化。