Django搜索排序

Django提供了一个SearchQuery类把查询词转换为一个搜索查询对象。

使用全文搜索的实例,根据查询词出现的频率和它们之间的距离对结果进行排序。

关于全文搜索更多内容,请看Django全文搜索-CSDN博客

相关性排序

编辑views.py,添加以下导入

python 复制代码
from django.contrib.postgres.search import SearchVector,SearchQuery,SearchRank

找到post_search

python 复制代码
            results = Post.objects.annotate(
                search = SearchVector('title','body'),
             ).filter(search=query)

替换为

python 复制代码
             search_vector = SearchVector('title','body')
             search_query = SearchQuery(query)
             results = Post.objects.annotate(
                 search = search_vector,
                 rank = SearchRank(search_vector,search_query)
             ).filter(search=search_query).order_by('-rank')

创建一个SearchQuery对象,通过它过滤结果,并使用SearchRank按相关性对结果排序。

  • SearchVector:在哪里查询
  • SearchQuery:查询词是什么
  • SearchRank:如何排序

权重排序

在按相关性排序结果时赋予它们更多权重。

例如,按标题而不是按内容匹配的帖子提供更多相关性。

编辑views.py

python 复制代码
            search_vector = SearchVector('title',weight='A') + SearchVector('body',weight='B')
            search_query = SearchQuery(query)
            results = Post.objects.annotate(
                search = search_vector,
                rank = SearchRank(search_vector,search_query)
            ).filter(rank__gte=0.3).order_by('-rank')

使用title和body字段构建的搜索向量应用了不同的权重。

默认权值为D(0.1),C(0.2),B(0.4),A(1.0)

示例对标题的搜索权重为1,对正文的权重为0.4。所以标题匹配讲优先于正文匹配。

对结果进行过滤,只显示排名高于0.3的结果。

最终查询方法代码示例

python 复制代码
def post_search(request):
    form = SearchForm()
    query = None
    results = []
    if 'query' in request.GET:
        form = SearchForm(request.GET)
        if form.is_valid():
            query = form.cleaned_data['query']
            
            search_vector = SearchVector('title',weight='A') + SearchVector('body',weight='B')
            search_query = SearchQuery(query)
            results = Post.objects.annotate(
                search = search_vector,
                rank = SearchRank(search_vector,search_query)
            ).filter(rank__gte=0.3).order_by('-rank')
    template = "blog/post/search.html"
    context={
        'form':form,
        'query':query,
        'results':results,
    }
    return render(request,template,context)

关于全文搜索的表单类,模版和路径的构建,请查看Django全文搜索-CSDN博客

相关推荐
FelixZhang02812 分钟前
不懂金融或不会编程,如何开始量化?从策略搭建到回测验证
人工智能·python·算法·数学建模·均值算法·自然语言处理·金融
打工仔折腾 AI28 分钟前
后端部署避坑:吃透IPv4地址、网络接口与CIDR前缀的实际应用
arm开发·人工智能·后端·python·性能优化
wangchunyu11411 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
2501_9445215912 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿13 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_9445215913 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港13 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_9679873713 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying883813 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
人工智能导论实践课13 小时前
【GUI桌面开发3】PyCharm配置外部工具
ide·python·pycharm