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

news2024/9/9 4:42:45

前言

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

前景概要

作为一个博客系统,搜索应该算是一个最基础的功能,但是为啥我一直没有添加?因为我也是有“苦衷”的。在上一个版本中是有这搜索功能的,但是自从使用了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.coloradmin.cn/o/1918267.html

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

相关文章

python--实验 9 类和对象

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

科普文:一天学会shell编程

1.shell概叙 本文将从shell执行、语法、实战三个方面来讲解shell编程,其实shell编程就是个批处理,将你平时在服务器上单独执行的命令,按照一定要求组织起来,写在一起,然后统一执行,就完事了。 对于运维人员…

零基础小白人手必备“新华字典”,涵盖入门到进阶,超全语法!精炼总结64页,背完你的Python就牛了!

《Python背记手册》是一本旨在帮助初学者快速入门Python的实用手册,其特点鲜明,内容全面且易于理解。 书籍PDF已打包好,戳这里领取 一、书籍基本信息 作者:书籍的作者通常具有深厚的Python开发背景,有的作者是在美国攻…

MAVSDK示例takeoff_and_land编译与使用

1.克隆MAVSDK源码 ,示例位于源码的examples中 2.安装MAVSDK,下载https://github.com/mavlink/MAVSDK/releases/download/v2.12.2/mavsdk-windows-x64-release.zip 下载后解压:

三星首款智能戒指 Galaxy Ring 将于7月24日上市,售价399美元

三星电子即将推出其首款智能戒指——Galaxy Ring,这款创新的可穿戴设备将于7月24日上市,定价为399美元。Galaxy Ring的亮相标志着三星在智能穿戴设备领域的新突破,它不仅证明了三星在技术革新上的持续能力,也显示了其在健康和健身…

编号根据规则自增生成,及spring事务和锁

1、 背景 需要根据一些规则来生成自增编号,比如:95JS0001,950002 95JS是固定的,而后缀的0001的长度也是可配置的,因为有一张表来进行维护 CREATE TABLE number_control (id bigint NOT NULL AUTO_INCREMENT COMMENT 主…

DW03D是一款用于锂离子/聚合物电池保护的高集成度解决方案。DW03D包含内部功率MOSFET、高精度电压检测电路和延迟电路

一般概述 DW03D产品是单节锂离子/锂聚合物可充电电池组保护的高集成度解决方案。DW03D包括了先进的功率MOSFET,高精度的电压检测电路和延时电路。 DW03D具有非常小的TSS08-8的封装,这使得该器件非常适合应用于空间限制得非常小的可充电电池组应用。…

生信软件25 - 三代测序数据灵敏比对工具ngmlr

1. ngmlr简介 CoNvex Gap-cost Ments for Long Reads(ngmlr)是一种长reads比对工具,可以将PacBio或Oxford Nanopore灵敏地与(大)参考基因组(比如人类参考基因组)对齐,能快速和正确地…

OpenSSH Server远程代码执行漏洞 (CVE-2024-6387)|centos7升级到最新版本OpenSSH-9.8.p1

一、漏洞概述 漏洞名称 OpenSSH Server远程代码执行漏洞 CVE ID CVE-2024-6387 漏洞类型 竞争条件 发现时间 2024-07-01 漏洞评分 暂无 漏洞等级 高危 攻击向量 网络 所需权限 无 利用难度 高 用户交互 无 PoC/EXP 未公开 在野利用 未发现 OpenS…

MechMind结构光相机 采图SDK python调用

测试效果 Mech-Mind结构光相机 Mech Mind(梅卡曼德)的结构光相机,特别是Mech-Eye系列,是工业级的高精度3D相机,广泛应用于工业自动化、机器人导航、质量检测等多个领域。以下是对Mech Mind结构光相机的详细解析&#…

阿里巴巴国际站携手NBA传奇托尼·帕克,中国卖家又一波利好!

在全球化浪潮日益汹涌的今天,跨界合作已成为推动品牌国际化进程的重要力量。近日,阿里巴巴国际站宣布了一项震撼业界的合作——正式签约NBA(美国职业篮球联赛)传奇控球后卫托尼帕克(Tony Parker)作为其全球…

2024年10款免费的项目管理软件推荐

本文向大家推荐10款2024年免费使用的项目管理软件,其中包括桌面应用和基于Web平台的多种产品,同时还涵盖了一些优秀的开源软件。 1.禅道开源项目管理软件 禅道是一款开源的、基于Web的项目管理软件,其功能丰富且操作简便,为团队提…

生产管理系统功能全拆解:哪些功能是企业真正需要的?

制造业的伙伴经常听到“生产管理”,但很多人可能只是模糊地知道它与工厂、生产线有关。那么,到底什么是生产管理呢?它的重要性又体现在哪里呢?接下来,我就以轻松的方式,带大家走进生产管理的世界&#xff0…

笔记:Qt开发之工程的多模块设计(pri)

目标:对于功能模块较多的Qt项目,使用pri文件管理模块文件,降低工程复杂度,提高软件模块的封装性和重用性。 一、知识储备 1.1 pro与pri文件 对于模块化编程,Qt提供了pro和pri,pro管理项目,pri…

算法 —— 模拟

目录 替换所有的问号 提莫攻击 Z字形变换 外观数列 各位读者有听说过“建模”一词吗?所谓“建模”,就是把事物进行抽象,根据实际问题来建立对应的数学模型。“抽象”并不意味着晦涩难懂;相反,它提供了大量的便利。…

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

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

Ubuntu编译PX4固件

目录 前言 准备编译参考 前言 要想自己编译PX4固件需要交叉编译器,交叉编译器可以将 x86架构 平台上写好程序编译出来,而编译出来的可执行文件是能用到 arm架构 的平台上。 本次编译是以 px4 v1.13.2 为例。 我的配置如下: 虚拟机 Ubuntu 18…

微气象仪的工作原理

型号推荐:云境天合TH-WQX5】风力发电传感器在风力发电系统中起着至关重要的作用,它们能够实时监测和记录各种关键参数,为风力发电机组的控制提供数据支持,从而确保风力发电系统的安全、高效运行。以下是对风力发电传感器的详细解析…

喜讯|华院计算法律大模型入围《2024大模型典型示范应用案例集》

2024年世界人工智能大会(WAIC)举办期间,中国信通院正式发布了《2024大模型典型示范应用案例集》(以下简称《案例集》)。该案例集由中国信通院华东分院、上海人工智能实验室主导,以产业化为导向,…

Vue从零到实战第一天

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…