使用django-haystack+whoosh实现全文搜索

前言

好像是上个星期在写代码的时候遇到了一些问题,这个问题似乎我之前也遇到过,印象中好像也写博客进行记录了的,于是就想在我的博客系统中“查找”(表示很无奈居然没有搜索功能🥹🥹),于是就利用现有的过滤功能进行查找,但之前的分类和标签早就不记得了😅 ,于是就一直没有找到,但印象中确实写过相关内容…所以就有点尴尬了…😅😅😅,所以为了解决这个问题,花了将近一整天的时间给博客系统加了一个全文搜索的功能。

前景概要

作为一个博客系统,搜索应该算是一个最基础的功能,但是为啥我一直没有添加?因为我也是有“苦衷”的。在上一个版本中是有这搜索功能的,但是自从使用了vitepress之后,它就没了,原因很简单,我对vitepress进行了“魔改”,vitepress的初衷是一个静态文本系统,也内置了搜索功能,但是博客系统得是动态的,与vitepress的理念是相反的,所以为了既要用vitepress的生态,也要支持“动态”功能,我对vitepress进行了魔改(这是一段艰苦而漫长的旅程),最后,它不会一次性把所有内容加载到前端,就无法使用它内置的local搜索了(algolia我没有考虑),所以也就一直没有搜索功能了…
所以,就这样为了实现博客系统的“动态”的需求,我把vitepress的搜索功能给整没了!我也尝试过去添加,但是最终都以失败告终,最终以为可以添加一个过滤功能来弥补它,但终究还是弥补不了…☹️

:::TIPS
上面提到的vitepress的静态和博客系统的动态的区别是:vitepress在build的时候会把所有的博客都build,在浏览器请求的时候也是一次性拿到所有的博客内容,这样它才能在前端实现搜索功能;而我所需要的是用户在请求一篇博客时就请求后端拿这篇博客的内容,所以这两者基本上是互相驳斥的。

:::

既要,又要,还要!

上面我为了既要viteoress的生态,也要博客系统支持“动态”加载的功能,我对vitepress进行魔改,导致搜索功能用不了了,但今天,完既要,又要,还要哈哈哈,我还要它的搜索功能!!!
OK,上面讲了一大堆废话,下面开始我们的正文吧!🙃🙃🙃

正文

重写vitepress的默认组件

我一开始想到的是直接修改它的源码,但是这样是一件吃力不讨好的事情(尝试过的人应该都知道,没尝试过的可以试试哈哈哈),于是就在网上不断搜索寻找解决方案,就在我找得快要绝望时,我在官方文档看到了曙光哈哈哈,它在介绍扩展默认主题的页面中介绍了一种重写默认组件的方法,也给出了示例代码:

import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vitepress'export default defineConfig({vite: {resolve: {alias: [{find: /^.*\/VPNavBar\.vue$/,replacement: fileURLToPath(new URL('./components/CustomNavBar.vue', import.meta.url))}]}}
})

所以,按照它的思路,只要我找到搜索的组件,然后把它替换成我自己的,那么就可以实现自定义的搜索功能了!

替换默认的搜索组件

如果使用的是local方式的话,它的搜索组件就是VPLocalSearchBox.vue,因此我这里直接把它替换成我自定义的MyVPLocalSearchBox.vue

image.badd226a3c6c11efbb7c00163e16d300.png
其中我自定义的搜索组件的内容,其实大部分都是复制它原有的,只不过把它的搜索源换成了我自己的后端。
image.8849c17c3c6d11efaffd00163e16d300.png

使用django-haystack+whoosh实现全文搜索的接口

前段的任务完成后,现在就只差一个后端接口了!
我一开始想到的是就是直接使用sql进行过滤搜索,以及顶多一个模糊匹配,但是这样我试了几下,效率都不在我的接受范围之内,于是想到了全文搜索会不会更快些?于是在网上找到了一些文章,看大家都是使用django-haystack在django中实现的全文搜索,于是我也就入坑了,它其实就是整合了一些搜索引擎,抽象了一层接口,增加了对这些搜索引擎的支持,它支持的搜索引擎如下:
image.c0ecbcea3c6e11efa5cd00163e16d300.png
我一开始尝试使用了elasticsearch,但是发现它还需要额外的依赖(这里我指的是python以外的依赖),感觉比较麻烦,最后发现whoosh它是纯python实现的,所以相比于其他的,它是相对友好的一个!
image.62bf613a3c6f11ef8bbd00163e16d300.png

配置流程

关于haystack使用whoosh进行全文搜索在Django中的配置流程,我搜索到的几篇博客都大同小异,其实都是参考官方的流程来的,这里给出官方的配置流程。
image.e42638b63c6f11ef8bbd00163e16d300.png

自定义搜索接口

根据官方的配置流程,你会发现,它配置了templates,最后返回的是一个html,搜索的逻辑在它自己的代码中,所以要实现一个返回json数据的接口,我们就得自定义:
image.885ed7a83c7011efb4ef00163e16d300.png
其实和django自带的写法差不多,这里用到了haystack的接口:SearchQuerySet。

到这里差不多就结束了,来试一下搜索功能叭~
image.1eae91023c7711efa72400163e16d300.png

perfect~~~😎😎😎

更多内容可以关注博主的个人博客系统:使用django-haystack+whoosh实现全文搜索

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

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

相关文章

Redis 主从复制,、哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式(Sentinel) 1.主要组件和概念 2.哨…

[240711] OpenSSF Scorecard - 自动评估开源项目安全风险的工具

目录 OpenSSF Scorecard - 自动评估开源项目安全风险的工具功能特点使用场景安装和使用竞品和相关项目进一步探索 OpenSSF Scorecard - 自动评估开源项目安全风险的工具 OpenSSF Scorecard 是一个由开源安全基金会(Open Source Security Foundation,Ope…

初学SpringMVC之 RestFul 风格、重定向和转发

RestFul 风格改变 URL 形式 比如之前是:http://localhost:8080/add?a1&b2 现在是:http://localhost:8080/add/a/b(全是斜杠) package com.demo.controller;import org.springframework.stereotype.Controller; import org…

odoo细分权限(根据业务需求)

odoo原生权限编写方式: 根据用户组分配权限 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_sale_order,sale.order,model_sale_order,sales_team.group_sale_salesman,1,1, 1,0 access_sale_order_manager,sale.order.manager,model_…

kaggle提交csv文件

使用colab完成实验后 将要提交的csv文件拖到kaggle网站自己加入的competition就行 如果kaggle网站无法注册,往往是人机验证问题: kaggle网站验证

邮票孔是什么?和V割有什么区别?

邮票孔,也称为安装孔或通孔,是 PCB 中的圆形或非圆形开口,旨在允许将组件或 PCB 本身连接到支撑结构上。这些孔通常从顶面到底部钻穿或冲穿 PCB 层,形成连续的通道。冲压孔有各种尺寸和形状, 取决于 PCB 及其所容纳组件…

餐饮渠道年销4.2亿盒,光明look 30亿的极致大单品是如何策划的?

餐饮渠道年销4.2亿盒,光明look 30亿的极致大单品是如何策划的? 红酒代理业务下滑,从餐饮渠道主攻奶品类 雨帆食品集团,自2002年起是湖北地区红酒代理商,同时兼任光明乳业湖北荆州代理商。然而,到了2011年&a…

python--实验 9 类和对象

知识点 面向对象编程思想 面向对象编程是一种编程范式,它使用“对象”来设计软件,这些对象可以包含数据和代码,即属性和方法。 面向对象的程序设计的核心是对象,世间存在的万物皆为对象(上帝式思维) 面向对象&#xf…

TomCat服务器安装和配置教程

1.TomCat下载路径 TomCat官方网站:http://tomcat.apache.org 前往该网站下载安装tomcat,tar.gz文件是Linux操作系统的安装版本,zip文件是 windows操纵系统的压缩版本 打开后是如下网站,请下载匹配的操作系统的文件并且选择合适的…

2023 年 GitHub 上最受欢迎的编程语言

JavaScript 仍然是使用最多的编程语言,在 Web 开发中占据重要地位。 被广泛用于 Web 应用程序开发,框架如 React 和 Angular 促进了单页应用程序的开发。 Node.js 的出现使其在后端编程中同样重要。 Python 由于其简单性和广泛的库,Pyth…

自注意力简介

在注意力机制中,每个查询都会关注所有的键值对并生成一个注意力输出。如果查询q,键k和值v都来自于同一组输入,那么这个注意力就被称为是自注意力(self-attention)。自注意力这部分理论,我觉得台大李宏毅老师…

新兴商业模式如何破局?市场策划专家的实战指南

在这个融合了传统市场、互联网和信息技术的大潮中,想要在市场营销策划上玩得转,咱们得有超凡的全局思维和跨界的协作精神。 下面,我就来和大家聊聊如何在这样一个复杂环境下搞定市场营销策划,让你在竞争激烈的市场中脱颖而出。 …

Nodejs 第八十二章(Nacos动态配置)

什么是动态配置? 在Nacos中,动态配置是指可以在运行时动态修改应用程序的配置信息,而不需要重新启动或重新部署应用程序。通过Nacos的动态配置功能,开发人员可以将应用程序的配置信息存储在Nacos服务器中,并在需要时进…

PTK是如何加密WLAN单播数据帧的?

1. References WLAN 4-Way Handshake如何生成PTK?-CSDN博客 2. 概述 在Wi-Fi网络中,单播、组播和广播帧的加密算法是由AP决定的。其中单播帧的加密使用PTK密钥,其PTK的密钥结构如下图所示: PTK的组成如上图所示,由K…

做一个专业的声音分析系统,需要对声音那些评判标准进行计算

为了构建一个专业的声音分析系统,需要对以下评判标准进行计算。每个标准需要相应的算法和技术指标来实现。下面是一些关键的评判标准和如何计算这些标准的具体方法: 1. 音质 清晰度 信噪比(SNR):计算音频信号中的信…

win11下部署Jenkins,build c#项目

一个c#的项目,由于项目经理总要新版本测试,以前每次都是手动出包,现在改成jenkins自动生成,节省时间。 一、下载Jenkins, 可以通过清华镜像下载Index of /jenkins/windows-stable/ | 清华大学开源软件镜像站 | Tsingh…

前端使用pinia中存入的值

导入pinia,创建pinia实例 使用pinia中的值

mysql8多值索引

MySQL8新出了一个多值索引,我还没体验过呢,今天试一试。 建表 我先建个表试一试多值索引的效果。我粗略地看了下多值索引的介绍,发现是只适用于数组类型的。所以我建一个含有数组字段的表试一试。语法还是挺麻烦的: create tabl…

2.电容(常见元器件及电路基础知识)

一.电容种类 1.固态电容 这种一般价格贵一些,ESR,ESL比较低,之前项目400W电源用的就是这个,温升能够很好的控制 2.铝电解电容 这种一般很便宜,ESR,ESL相对大一些,一般发热量比较大,烫手。 这种一般比上一个贵一点&am…

开源公司网站源码系统,降低成本,提升效率 附带完整的安装代码包以及搭建教程

系统概述 开源公司网站源码系统是一个基于开源技术的网站建设解决方案。它提供了完整的网站框架和功能模块,允许企业快速搭建起一个功能齐全、设计美观的企业网站。该系统不仅降低了网站开发的成本,还大大提高了建设效率,使企业能够更快地将…