Skip to main content

通过示例开始SQLite全文搜索

SQLite全文搜索简介

虚拟表是SQLite的自定义扩展。虚拟表与普通表类似。虚拟表和普通表之间的区别在于数据来自何处,即在处理普通表时,SQLite访问数据库文件以检索数据。但是,当您访问虚拟表时,SQLite会调用自定义代码来获取数据。自定义代码可以具有指定的逻辑来处理某些任务,例如从多个数据源获取数据。

要在SQLite中使用全文搜索,可以使用FTS5虚拟表模块。

下面的CREATE VISUAL TABLE语句创建了一个包含两列的FTS5表:

CREATE VIRTUAL TABLE table_name 
USING FTS5(column1,column2...);

请注意,不能在CREATE VIRTUAL TABLE语句中添加类型、约束或主键声明来创建FTS5表。如果这样做,SQLite将发出一个错误。

与在不指定主键列的情况下创建普通表一样,SQLite向FTS5表中添加了一个隐式rowid列。

下面的示例创建了一个名为posts的FTS5表,其中包含两列title和body。

CREATE VIRTUAL TABLE posts 
USING FTS5(title, body);

与普通表类似,您可以按如下方式将数据插入posts表:

INSERT INTO posts(title,body)
VALUES('Learn SQlite FTS5','This tutorial teaches you how to perform full-text search in SQLite using FTS5'),
('Advanced SQlite Full-text Search','Show you some advanced techniques in SQLite full-text searching'),
('SQLite Tutorial','Help you learn SQLite quickly and effectively');

并根据它查询数据:

SELECT * FROM posts;

SQLite full-text search - table data

使用全文搜索查询数据

可以使用以下三种方法之一对FTS5表执行全文查询。

首先,在SELECT语句的WHERE子句中使用匹配运算符。例如,要获取包含术语fts5的所有行,可以使用以下查询:

SELECT * 
FROM posts
WHERE posts MATCH 'fts5';

SQLite full-text search - MATCH operator

其次,在SELECT语句的WHERE子句中使用equal(=)运算符。以下语句返回与上述语句相同的结果:

SELECT * 
FROM posts
WHERE posts = 'fts5';

第三,使用表值函数语法。通过这种方式,可以使用搜索项作为第一个表参数:

SELECT * 
FROM posts('fts5');

默认情况下,FTS5是独立于大小写的。它将fts5FTS5和Fts5视为相同的术语。

要对搜索结果从最相关到最不相关进行排序,请使用ORDER BY子句,如下所示:

SELECT * 
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;

SQLite full-text search - Sorting

使用全文查询语法

全文搜索查询由短语组成,其中每个短语都是一个或多个标记的有序列表。可以使用“+”运算符连接两个短语,如下例所示:

"learn SQLite"
"learn + SQLite"

如果文档包含至少一个子序列的标记,且该子序列与用于构造短语的标记序列相匹配,则FTS5将确定文档是否与短语匹配。

以下查询返回与搜索词Learn SQLite匹配的所有文档:

SELECT * 
FROM posts
WHERE posts MATCH 'learn SQLite';

SQLite full-text search - query syntax

前缀搜索

您可以使用星号()作为前缀标记。当一个短语包含星号()时,它将匹配任何包含以该短语开头的标记的文档。例如,search*与search、search、Searchs等匹配。请参见以下示例:

SELECT * 
FROM posts
WHERE posts = 'search*';

SQLite full-text search - prefix searches

布尔运算符

可以使用布尔运算符(例如NOT、OR或AND)组合查询。

例如,要获取与学习短语匹配但与FTS5短语不匹配的文档,请使用NOT运算符,如下所示:

SELECT * 
FROM posts
WHERE posts MATCH 'learn NOT text';

SQLite full-text search - NOT operator

要搜索与短语学习或文本匹配的文档,请使用or运算符作为以下示例:

SELECT * 
FROM posts
WHERE posts MATCH 'learn OR text';

SQLite full-text search - OR operator

要查找与SQLite和searching匹配的文档,请使用and运算符,如下所示:

SELECT * 
FROM posts
WHERE posts MATCH 'sqlite AND searching';

SQLite full-text search - AND operator

要更改运算符优先级,请使用括号对表达式进行分组。例如:

SELECT * 
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';

SQLite full-text search - Combine Logical Operators

该语句返回与search和sqlite或help匹配的文档。要查找与search和sqlite或help匹配的文档,请使用括号,如下所示:

SELECT * 
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';

SQLite full-text search - Operators precedence

内置辅助功能

SQLite提供了三个内置的辅助函数,可以在FTS5表的全文查询中使用。

例如,下面的查询使用highlight()函数使用\<b>标记修饰搜索词:

SELECT highlight(posts,0, '<b>', '</b>') title, 
highlight(posts,1, '<b>', '</b>') body
FROM posts
WHERE posts MATCH 'SQLite'
ORDER BY rank;

SQLite full-text search - highlight function

在本教程中,您学习了如何通过FTS5虚拟表模块使用SQLite全文搜索功能。