当前位置: 首页 > news >正文

SQLite 全文检索:快速高效的文本查询方案

文章目录

  • 什么是全文检索?
  • 如何启用 FTS?
  • 插入数据
  • 执行全文检索
  • 关联原始表与 FTS 表
  • 数据更新
  • 结论

说明: 本文以博客内容全文检索为例。

什么是全文检索?

全文检索是指对文本数据进行索引和查询的一种技术。与常规的 LIKE 查询不同,全文检索通过对文本建立倒排索引,可以更快地处理文本搜索,尤其在涉及大量数据时,性能优势尤为明显。

SQLite 中,使用 FTS5 模块可以轻松实现全文检索功能。该模块是一个虚拟表模块,允许你创建一个可以进行全文索引的表。

如何启用 FTS?

SQLite 中启用全文检索的前提是 SQLite 已经支持 FTS5(通常默认支持)。我们可以使用以下命令创建一个支持全文检索的表:

CREATE VIRTUAL TABLE blog_posts_fts USING fts5(id, title, content);

上述命令创建了一个名为 blog_posts_fts 的虚拟表,其中包含 idtitlecontent 三个字段,并为 titlecontent 字段建立了全文索引。

插入数据

由于 FTS 表是虚拟表,因此无法直接与普通表同步数据,需要手动将数据插入到 FTS 表中。示例代码如下:

INSERT INTO blog_posts_fts (id, title, content)
SELECT id, title, content FROM blog_posts;

这会将 blog_posts 表中的所有数据同步到 blog_posts_fts 表中,以供全文检索使用。

执行全文检索

执行全文检索时,可以使用 MATCH 语法来查询文本内容。以下示例展示了如何搜索包含关键字 SQLite 的文章:

SELECT id, title, content
FROM blog_posts_fts
WHERE blog_posts_fts MATCH 'SQLite';

这种方式可以在大量数据中快速找到与关键字匹配的结果。

关联原始表与 FTS 表

为了方便获取更多的元数据(如日期、作者等),我们可以通过 id 关联 FTS 表与原始的 blog_posts 表。例如:

SELECT bp.id, bp.title, bp.date, fts.content
FROM blog_posts bp
JOIN blog_posts_fts fts ON bp.id = fts.id
WHERE fts MATCH 'SQLite'
ORDER BY bp.date DESC;

这样,你就可以在检索的同时获取完整的博客信息,并按日期进行排序。

数据更新

blog_posts 表的数据发生变化时,需要同步更新到 blog_posts_fts 表。你可以手动更新,也可以使用触发器自动同步:

CREATE TRIGGER after_blog_posts_insert
AFTER INSERT ON blog_posts
BEGININSERT INTO blog_posts_fts (id, title, content)VALUES (NEW.id, NEW.title, NEW.content);
END;CREATE TRIGGER after_blog_posts_update
AFTER UPDATE ON blog_posts
BEGINUPDATE blog_posts_ftsSET title = NEW.title, content = NEW.contentWHERE id = NEW.id;
END;CREATE TRIGGER after_blog_posts_delete
AFTER DELETE ON blog_posts
BEGINDELETE FROM blog_posts_fts WHERE id = OLD.id;
END;

触发器会确保 FTS 表自动更新,不需要手动同步。

结论

SQLite 提供了功能强大的 FTS 模块,能够显著提高文本数据查询的效率。通过建立全文检索索引,可以轻松地在大量文本数据中找到相关的记录。在实际项目中,如果有大量的文本数据需要搜索,SQLiteFTS 功能不失为一种简便而有效的解决方案。

相关文章:

SQLite 全文检索:快速高效的文本查询方案

文章目录 什么是全文检索?如何启用 FTS?插入数据执行全文检索关联原始表与 FTS 表数据更新结论 说明: 本文以博客内容全文检索为例。 什么是全文检索? 全文检索是指对文本数据进行索引和查询的一种技术。与常规的 LIKE 查询不同&#xff0c…...

【微信小程序】报修管理

一、报修管理 报修管理是为方便业主联系维修师傅的一个服务,业主确认需要维修的房到后,再指定维修项目以及上门的时间待待师傅联系上门服务即可。 1.1 在线报修 业主通过在线的方式填写报修的信息,包括房屋信息、维修项目、联系电话、上门…...

C++——视频问题总结

1、C和C的区别 CC面向过程对象注重程序的实现逻辑程序的整体设计内容C语言采用了一种有序的编程方法——结构化编程:将一个大型程序分解为一个个小型的,易于编写的模块,所有模块有序调动,形成了一个程序的完整的运行链C将问题分解…...

Ubuntu24.04 network:0 unclaimed wireless adapter no found

前言: 所遇问题原因在于,折腾显卡cuda版本,导致nvidia驱动没了,使用sudo ubuntu-drivers autoinstall后,驱动有了,但是reboot后无线网卡无法识别,此外usb无线网络也无法使用,ifconfi…...

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中,使用MyBatis-Plus通过创建的实体类对数据库的操作过程中,通过实体创建数据库表是没有问题的,而在接口调用服务类操作数据库的时候,会出现报错。报错详情如下: 服务请求异…...

深入浅出 ChatGPT 底层原理:Transformer

Transformer 在人工智能和自然语言处理领域,Transformer架构的出现无疑是一个里程碑式的突破。它不仅推动了GPT(Generative Pre-trained Transformer)等大型语言模型的发展,还彻底改变了我们处理和理解自然语言的方式。 GPT与Transformer GPT 近几年,人工智能技…...

opc da 服务器数据 转 IEC61850项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 用IEC61850协议转发数据 7 网关使用多个逻辑设备和逻辑节点的方法 8 在服务器上运行仰科OPC DA采集软件 9 案例总结 1 案例说明 在OPC DA服务器上运行OPC …...

SystemVerilog学习笔记(十一):接口

在Verilog中,模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构,它封装了模块之间的通信。一个 inter…...

华大单片机跑历程IO口被写保护怎么解决

一,说明 使用的单片机是HC32F460KETA华大单片机,使用的代码历程是小华单片机历程,具体历程在小华官网都可以找到。   在使用小华历程跑模拟IIC时,SCL时钟是有的,但是IO输入被LOCK了,所以在跑历程进行断点…...

Iotop使用

文章目录 Iotop依赖及编译1:内核配置2: 环境配置3.依赖库ncurses3.1 Ncurses的编译配置 4. Iotop的编译及修改5.测试效果如下: Iotop依赖及编译 源码路径:https://github.com/Tomas-M/iotop#how-to-build-from-source (GitHub - Tomas-M/iotop: A top u…...

定积分的快速计算技巧

快速换元公式——左加右减 对称区间,偶倍奇零 如果遇到对称区间,拿不准是奇函数还是偶函数直接用如下公式: 奇函数时: 偶函数时: arctanx与tanx的和式计算: 周期函数的积分性质 定积分几何意义 定积分的…...

第T7周:Tensorflow实现咖啡豆识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: (二)具体步骤 1. 使…...

imagehash图片去重:保留图片文件名

简介 在日常工作中,我们可能需要管理大量图片,这些图片中可能存在图像相同文件名不同的情况。手动删除这些重复的图片既费时又费力。为了解决这个问题,我们可以编写一个Python脚本来自动化这个过程。 准备工作 在开始之前,请确保…...

在Docker环境下为Nginx配置HTTPS

前言 配置HTTPS已经成为网站部署的必要步骤。本教程将详细介绍如何在Docker环境下为Nginx配置HTTPS,使用自签名证书来实现加密通信。虽然在生产环境中建议使用权威CA机构颁发的证书,但在开发测试或内网环境中,自签名证书是一个很好的选择。 …...

vue面试题9|[2024-11-15]

问题1&#xff1a;scoped原理 1.作用&#xff1a;让样式在本组件中生效&#xff0c;不影响其他组件 2.原理&#xff1a;给节点新增自定义属性&#xff0c;然后css根据属性选择器添加样式。 问题2&#xff1a;让css只在当前组件生效 <style scoped> 问题3&#xff1a;scss…...

大数据技术在金融风控中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据技术在金融风控中的应用 大数据技术在金融风控中的应用 大数据技术在金融风控中的应用 引言 大数据技术概述 定义与原理 发…...

安装一键式重置密码插件(Linux)-CloudResetPwdAgent

为了保证使用镜像创建的裸金属服务器可以实现一键式密码重置功能&#xff0c;建议您在制作镜像时安装重置密码插件“CloudResetPwdAgent”。 前提条件 需保证虚拟机根目录可写入&#xff0c;且剩余空间大于600MB。 1.下载插件包 华为云已提供下载包连接 在PC机里下载好软件…...

如何平滑切换Containerd数据目录

如何平滑切换Containerd数据目录 大家好&#xff0c;我是秋意零。 这是工作中遇到的一个问题。搭建的服务平台&#xff0c;在使用的过程中频繁出现镜像本地拉取不到问题&#xff08;在项目群聊中老是被人出来&#x1f605;&#xff09;原因是由于/目录空间不足导致&#xff0…...

月影和米家大路灯哪个好?书客、月影、米家谁会更胜一筹!

月影和米家大路灯哪个好&#xff1f;近两年以来&#xff0c;护眼大路灯以良好的品质走进大众的视线&#xff0c;成为许多用眼人群的刚需品&#xff0c;不少用户说可以改善光线质量&#xff0c;视觉疲劳感夜可以减少&#xff0c;但又有人说护眼大路灯是“幌子、智商税”&#xf…...

instanceof 的模式匹配(二)

在经过了JEP305(jdk14)和JEP375(jdk15)的两轮预览之后&#xff0c;模式匹配终于迎来了他的交付日期&#xff0c;在2022年发布的JDK16中&#xff0c;伴随着JEP 394的发布&#xff0c;预览结束了&#xff0c;我们来看一下这个特性的结束点到底说了什么。 在这次预览之中&#xff…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...