全文搜索¶
SQLite 包含 一种强大的机制用于对 SQLite 记录启用全文搜索。Datasette 可以检测底层数据库中的表格是否配置了全文搜索,并显示用于过滤该表格的搜索界面。
这是一个搜索示例

Datasette 自动检测哪些表格已配置了全文搜索。
表格页面和表格视图 API¶
支持全文搜索的表格视图可以使用查询字符串参数 ?_search=TERMS
进行查询。这将对索引中包含的所有列的内容运行搜索。
尝试这个示例:fara.datasettes.com/fara/FARA_All_ShortForms?_search=manafort
SQLite 全文搜索支持通配符。这意味着您可以通过在搜索词末尾包含星号来轻松实现前缀自动补全——例如
/dbname/tablename/?_search=rob*
这将返回所有包含至少一个以字母 rob
开头的单词的记录。
您还可以使用 _search_COLNAME=TERMS
对特定命名列的内容运行搜索——例如,这将仅搜索 FTS 索引中 name
列提到 Sarah
的行
/dbname/tablename/?_search_name=Sarah
高级 SQLite 搜索查询¶
SQLite 全文搜索支持多种高级查询,包括 AND
, OR
, NOT
和 NEAR
。
Datasette 默认禁用这些功能,以确保它们不会对不了解它们的用户造成错误或混淆。您可以通过向表格页面查询字符串添加 &_searchmode=raw
来禁用此转义并使用高级查询。
如果您想为特定表格默认启用这些操作符,可以通过将 "searchmode": "raw"
添加到该表格的元数据配置中来实现,参见配置表格或视图的全文搜索。
如果在表格元数据中指定了该选项,但您想覆盖它并恢复默认行为,您可以将 &_searchmode=escaped
附加到查询字符串。
配置表格或视图的全文搜索¶
如果一个表格使用如下所示的 CREATE VIRTUAL TABLE
的 content=
参数设置了相应的 FTS 表格,Datasette 将自动检测到它,并在该表格的页面上添加一个搜索界面。
您还可以使用查询字符串参数或元数据手动配置哪个表格应用于全文搜索。您可以为一个特定表格设置关联的 FTS 表格,也可以为一个视图设置;如果这样做,该 SQL 视图的页面将提供搜索选项。
使用 ?_fts_table=x
可以覆盖特定页面的 FTS 表格。如果主键不是 rowid
,您也可以使用 ?_fts_pk=col
进行设置。这对于视图特别有用,例如
https://latest.datasette.io/fixtures/searchable_view?_fts_table=searchable_fts&_fts_pk=pk
fts_table
元数据属性可用于指定关联的 FTS 表格。如果用于填充 FTS 表格的表格中的主键列不是 rowid
,您可以使用 fts_pk
属性指定要使用的列。
"searchmode": "raw"
属性可用于将表格默认设置为接受 SQLite 高级搜索操作符,如高级 SQLite 搜索查询中所述。
这里是一个示例,它为基于 ads
表格定义的 display_ads
视图启用了全文搜索(带 SQLite 高级搜索操作符),因此需要对 ads_fts
表格运行 FTS,并使用 id
作为主键
{
"databases": {
"russian-ads": {
"tables": {
"display_ads": {
"fts_table": "ads_fts",
"fts_pk": "id",
"searchmode": "raw"
}
}
}
}
}
使用自定义 SQL 进行搜索¶
您可以在自定义 SQL 查询中包含全文搜索结果。SQLite 搜索的一般模式是作为子查询运行搜索以返回 rowid 值,然后将这些 rowid 包含在查询的另一部分中。
您可以通过在表格页面上运行搜索然后点击“查看和编辑 SQL”来查看底层 SQL,从而查看基本搜索的语法。例如,考虑对 美国 FARA 数据库中的 manafort 进行的此搜索
/fara/FARA_All_ShortForms?_search=manafort
如果您点击查看和编辑 SQL,您会看到底层 SQL 如下所示
select
rowid,
Short_Form_Termination_Date,
Short_Form_Date,
Short_Form_Last_Name,
Short_Form_First_Name,
Registration_Number,
Registration_Date,
Registrant_Name,
Address_1,
Address_2,
City,
State,
Zip
from
FARA_All_ShortForms
where
rowid in (
select
rowid
from
FARA_All_ShortForms_fts
where
FARA_All_ShortForms_fts match escape_fts(:search)
)
order by
rowid
limit
101
为 SQLite 表格启用全文搜索¶
Datasette 利用了 SQLite 的外部内容机制,该机制允许将一个全文搜索虚拟表格与另一个 SQLite 表格的内容关联起来。
要为一个表格设置全文搜索,您需要做两件事
创建一个与您的表格关联的新 FTS 虚拟表格
用您想要能够运行搜索的数据填充该 FTS 表格
使用 sqlite-utils 配置 FTS¶
sqlite-utils 是一个用于操作 SQLite 数据库的 CLI 工具和 Python 库。您可以从Python 代码中使用它来配置 FTS 搜索,或者使用随附的命令行工具实现同样的目标。
以下是如何使用 sqlite-utils
为 items
表格在 name
和 description
列上启用全文搜索
$ sqlite-utils enable-fts mydatabase.db items name description
使用 csvs-to-sqlite 配置 FTS¶
如果您的数据最初是 CSV 文件,您可以使用 Datasette 的配套工具 csvs-to-sqlite 将该文件转换为 SQLite 数据库,并在特定列上启用全文搜索。对于一个名为 items.csv
的文件,如果您想在 name
和 description
列上进行全文搜索,您可以运行以下命令
$ csvs-to-sqlite items.csv items.db -f name -f description
手动配置 FTS¶
我们推荐使用 sqlite-utils,但如果您想手动创建 SQLite 全文搜索表格,可以使用以下 SQL。
要为一个名为 items
的表格启用全文搜索,使其作用于 name
和 description
列,您可以运行此 SQL 来创建一个新的 items_fts
FTS 虚拟表格
CREATE VIRTUAL TABLE "items_fts" USING FTS4 (
name,
description,
content="items"
);
这创建了一组表格来支持对 items
的全文搜索。新的 items_fts
表格将被 Datasette 检测为 items
表格的 fts_table
。
仅创建表格是不够的:您还需要用您希望可搜索的数据副本填充它。您可以使用以下 SQL 来实现
INSERT INTO "items_fts" (rowid, name, description)
SELECT rowid, name, description FROM items;
如果您的表格包含引用其他表格的外键列,您可以使用 JOIN 将该数据包含在您的全文搜索索引中。假设 items
表格有一个名为 category_id
的外键列,它引用了 categories
表格——您可以像这样创建一个全文搜索表格
CREATE VIRTUAL TABLE "items_fts" USING FTS4 (
name,
description,
category_name,
content="items"
);
然后像这样填充它
INSERT INTO "items_fts" (rowid, name, description, category_name)
SELECT items.rowid,
items.name,
items.description,
categories.name
FROM items JOIN categories ON items.category_id=categories.id;
您可以使用此技术从任何对您的项目有意义的表格和 JOIN 组合中填充全文搜索索引。
FTS 版本¶
SQLite FTS 模块有三个不同版本:FTS3、FTS4 和 FTS5。您可以通过查看 /-/versions
页面来判断您的 Datasette 实例支持哪个版本。
FTS5 是最先进的模块,但在您的 Python 安装捆绑的 SQLite 版本中可能不可用。最重要的是,FTS5 是唯一无需额外代码即可按搜索相关性排序的版本。
如果您无法确定 FTS5 是否可用,您应该使用 FTS4。