Django搜索排序

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

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

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

相关性排序

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

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

找到post_search

            results = Post.objects.annotate(search = SearchVector('title','body'),).filter(search=query)

替换为

             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

            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的结果。

最终查询方法代码示例

def post_search(request):form = SearchForm()query = Noneresults = []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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中的数据类型

1.基本数据类型 数字(Number):用于表示数字,包括整数和浮点数。字符串(String):用于表示文本数据,由一系列字符组成。布尔值(Boolean):用于表示真…

Queue接口分析

一、Queue是什么 该接口是Java集合框架成员 Queue: 通常(但不一定)队列就是一个先入先出(FIFO)的数据结构,和堆一样(但可以进行转换,比如优先级列队排序,又或者改为栈形…

C++牛客知识点3

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 接上文。 一、1月10号 牛客网公司真题_免费模拟题库_企业面试|笔试真题 1、题目1 …

私域爆款活动实操指南,让你轻松成为营销高手!

私域运营活动是公司运营中非常重要的一环,它能够提高用户参与度、增加用户忠诚度,并为公司带来更多的商业机会。然而,策划和执行一场成功的私域运营活动并不容易,需要思维缜密、部门合作以及落地能力等方面的综合素养。今天来跟大…

centos下升级git版本

1 问题描述 centos7系统默认的git安装版本是1.8,但是在项目构建中发现git版本过低,导致构建AI模型环境时出现各种错误,于是用源码编译的方式进行升级,同时该文章也适用于安装新的git。 2. 升级安装 2.1 第一步卸载原有的git r…

怎么把视频设置为电脑桌面

1、打开腾讯软件中心,搜索并下载【火萤视频桌面】,不要安装(因为卸载会出错)。 2、找到下载的火萤视频桌面exe程序,以【打开压缩包】的方式打开,把其中的WPengine文件夹解压到桌面。 3、双击打开WPengine…

亚信安全深度解读2023年中国网络安全重要政策法规

亚信安全在对2023年国内网络安全政策的持续跟踪和研究基础上进行了详细分析。观察整体态势,本年度网络安全政策的发布呈现出高密度特征,共计引起行业高度关注的政策达50余项。数据安全领域、个人信息保护和数据跨境安全成为关注的热点,分别有…

Java面试之并发篇(一)

1、前言 本篇主要总结JAVA面试中关于并发相关的高频面试题。本篇的面试题基于网络整理,和自己编辑。在不断的完善补充哦。 2、简述程序、进程、线程、的基本概念? 2.1、程序 程序,是含有指令和数据的文件,被存储在磁盘或其他的…

Spring面试整理-Autowired和Resource关键字的区别

@Autowired 和 @Resource 都是Spring框架中用于依赖注入的注解,但它们在功能和使用方式上有一些重要的区别: @Autowired 来源:@Autowired 是Spring框架的一部分。注入方式:它默认按照类型(Type)来自动装配依赖。可选性:可以与 @Qualifier 注解结合使用,以进一步细化需要…

大数据开发个人简历范本(2024最新版-附模板)

大数据开发工程师个人简历范本> 男 22 本科 张三 计算机科学与技术 1234567890 个人概述 具备深入的Hadoop大数据运维工程师背景,熟悉相关技术和工具 具备良好的团队合作能力,善于沟通和协作 具有快速学习新知识和解决问题的能力 对于数据科学…

Java中的集合框架

概念与作用 集合概念 现实生活中:很多事物凑在一起 数学中的集合:具有共同属性的事物的总体 java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象 在编程时,常常需要集中存放多个…

GEE计算Landsat8的NDVI

目录 前言源代码结果 前言 NDVI(近红-红)/(近红红) normalizedDifference方法是(A-B)/(AB)的计算方法 计算NDVI一般用来配合其他反演参数,构造指数或者数据升降尺度。 …

MinIO (五) .net core实现分片上传

开发环境 Win11 vs2022 appsettings.json添加配置项 //minIO配置"MinIO": {//服务器IP"Endpoint": "192.168.xx.xx:9090",//账号"AccessKey": "3xR7i4zs1vLnxxxxxxxx",//密码"SecretKey": "P6bAnyzJm47Ub…

Java IO学习和总结(超详细)

一、理解 I/O 是输入和输出的简写,指的是数据在计算机内部和外部设备之间的流动。简单来说,当你从键盘输入数据、从鼠标选择操作,或者在屏幕上看到图像,这些都是 I/O 操作。它就像是计算机与外部世界沟通的桥梁,没有 I…

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机,与连接工具连接好,创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 jdk安装 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径…

Poi实现根据word模板导出-图表篇

往期系列传送门: Poi实现根据word模板导出-文本段落篇 (需要完整代码的直接看最后位置!!!) 前言: 补充Word中图表的知识: 每个图表在word中都有一个内置的Excel,用于…

链家JAVA笔试题

单选题 1、在Java中下列关于自动类型转换说法正确的是( )。 A. 基本数据类型和String相加结果一定是字符串型 B. char类型和int类型相加结果一定是字符 C. double类型可以自动转换成int D. char int double “ ”结果一定是double 参考答案&am…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(3)

接前一篇文章:玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(2) 上一篇文章结束时在等待提示的各依赖包下载安装后的编译结果,但是很遗憾,编译并没有最终完成,既未成功也没有失…

以unity技术开发视角对android权限的讲解

目录 前言 Android权限分类 普通权限 普通权限定义 普通权限有哪些 危险权限 危险权限的定义 危险权限有哪些 动态申请权限实例 申请单个权限实例 第一步:在清单文件中声明权限 第二步:在代码中进行动态申请权限 申请多个权限实例 第一步&am…

Android Fragment 生命周期

onAttach():被添加到Activity中回调,只会被调用一次。 onCreate():创建Fragment时回调,只会被调用一次。 onCreateView():每次创建,绘制该Fragment的View组件时回调,会将显示的View返回 onAc…