SQLite 全文检索:快速高效的文本查询方案
什么是全文检索?
全文检索是指对文本数据进行索引和查询的一种技术。与常规的 LIKE 查询不同,全文检索通过对文本建立倒排索引,可以更快地处理文本搜索,尤其在涉及大量数据时,性能优势尤为明显。
在 SQLite 中,使用 FTS5 模块可以轻松实现全文检索功能。该模块是一个虚拟表模块,允许你创建一个可以进行全文索引的表。
如何启用 FTS?
在 SQLite 中启用全文检索的前提是 SQLite 已经支持 FTS5(通常默认支持)。我们可以使用以下命令创建一个支持全文检索的表:
1 | CREATE VIRTUAL TABLE blog_posts_fts USING fts5(id, title, content); |
上述命令创建了一个名为 blog_posts_fts 的虚拟表,其中包含 id、title 和 content 三个字段,并为 title 和 content 字段建立了全文索引。
插入数据
由于 FTS 表是虚拟表,因此无法直接与普通表同步数据,需要手动将数据插入到 FTS 表中。示例代码如下:
1 | INSERT INTO blog_posts_fts (id, title, content) |
这会将 blog_posts 表中的所有数据同步到 blog_posts_fts 表中,以供全文检索使用。
执行全文检索
执行全文检索时,可以使用 MATCH 语法来查询文本内容。以下示例展示了如何搜索包含关键字 SQLite 的文章:
1 | SELECT id, title, content |
这种方式可以在大量数据中快速找到与关键字匹配的结果。
关联原始表与 FTS 表
为了方便获取更多的元数据(如日期、作者等),我们可以通过 id 关联 FTS 表与原始的 blog_posts 表。例如:
1 | SELECT bp.id, bp.title, bp.date, fts.content |
这样,你就可以在检索的同时获取完整的博客信息,并按日期进行排序。
数据更新
当 blog_posts 表的数据发生变化时,需要同步更新到 blog_posts_fts 表。你可以手动更新,也可以使用触发器自动同步:
1 | CREATE TRIGGER after_blog_posts_insert |
触发器会确保 FTS 表自动更新,不需要手动同步。
优化FTS虚拟表
为了提高FTS虚拟表的性能和存储效率,可以定期对其进行优化。在SQLite中,可以使用OPTIMIZE命令优化FTS虚拟表。例如
1 | INSERT INTO articles(articles) VALUES('optimize'); |
删除原始FTS虚拟表
1 | DROP TABLE old_articles; |
