Datasette 项目中的全文搜索功能详解
全文搜索概述
Datasette 利用 SQLite 内置的强大全文搜索机制,为用户提供了便捷的数据检索功能。当底层数据库表配置了全文搜索索引后,Datasette 会自动检测并在表页面显示搜索界面。
SQLite 的全文搜索支持三种版本:FTS3、FTS4 和 FTS5。FTS5 是最先进的版本,但可能不适用于所有 Python 环境中的 SQLite 版本。如果无法确定 FTS5 是否可用,建议使用 FTS4。
基本搜索功能
在 Datasette 中,可以通过 ?_search=TERMS
查询字符串参数对支持全文搜索的表进行查询。这个搜索会针对索引中包含的所有列内容执行。
SQLite 全文搜索支持通配符功能,这使得实现前缀自动补全变得非常简单。例如:
/dbname/tablename/?_search=rob*
这将返回所有包含至少一个以 "rob" 开头的单词的记录。
高级搜索功能
SQLite 全文搜索支持多种高级查询语法,包括 AND
、OR
、NOT
和 NEAR
等操作符。默认情况下,Datasette 会禁用这些功能以避免对不了解这些功能的用户造成困惑。
要使用这些高级查询功能,可以在表页面查询字符串中添加 &_searchmode=raw
参数。如果想为特定表默认启用这些操作符,可以在该表的元数据配置中添加 "searchmode": "raw"
。
表和视图的全文搜索配置
当表使用 CREATE VIRTUAL TABLE
命令的 content=
参数设置了对应的 FTS 表时,Datasette 会自动检测并在该表的页面添加搜索界面。
也可以通过查询字符串参数或元数据手动配置哪个表应该用于全文搜索。可以为特定表设置关联的 FTS 表,也可以为视图设置 - 这样该 SQL 视图的页面将提供搜索选项。
自定义 SQL 中的搜索
可以在自定义 SQL 查询中包含全文搜索结果。SQLite 搜索的一般模式是将搜索作为返回 rowid 值的子查询运行,然后在查询的其他部分中包含这些 rowid。
要查看基本搜索的语法,可以在表页面上运行搜索,然后点击"查看和编辑 SQL"查看底层 SQL。
启用 SQLite 表的全文搜索
Datasette 利用了 SQLite 中的外部内容机制,允许全文搜索虚拟表与另一个 SQLite 表的内容相关联。要为表设置全文搜索,需要做两件事:
- 创建一个与表关联的新 FTS 虚拟表
- 用想要搜索的数据填充该 FTS 表
使用 sqlite-utils 配置 FTS
sqlite-utils 是一个用于操作 SQLite 数据库的 CLI 工具和 Python 库。可以使用它来配置 FTS 搜索。
使用 csvs-to-sqlite 配置 FTS
如果数据最初在 CSV 文件中,可以使用 csvs-to-sqlite 工具将该文件转换为 SQLite 数据库并在特定列上启用全文搜索。
手动配置 FTS
虽然推荐使用 sqlite-utils,但也可以手动创建 SQLite 全文搜索表。要为名为 items
的表启用针对 name
和 description
列的全文搜索,可以运行以下 SQL 来创建一个新的 items_fts
FTS 虚拟表:
CREATE VIRTUAL TABLE "items_fts" USING FTS4 (
name,
description,
content="items"
);
创建表后,还需要用想要搜索的数据填充它:
INSERT INTO "items_fts" (rowid, name, description)
SELECT rowid, name, description FROM items;
如果表有外键列引用其他表,可以使用连接将这些数据包含在全文搜索索引中。
总结
Datasette 的全文搜索功能为用户提供了强大的数据检索能力。通过合理配置,可以实现从简单搜索到复杂查询的各种需求。无论是通过工具自动配置还是手动设置,都能灵活地满足不同场景下的搜索需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考