全文搜索是 DuckDB 的一个扩展,它允许对字符串进行搜索,类似于 SQLite 的 FTS5 扩展。
安装和加载
fts 扩展将在首次使用时从官方扩展仓库自动加载。如果您想手动安装和加载它,请运行
INSTALL fts;
LOAD fts;
用法
此扩展为 DuckDB 添加了两个 PRAGMA 语句:一个用于创建索引,一个用于删除索引。此外,还添加了一个标量宏 stem,供扩展内部使用。
PRAGMA create_fts_index
create_fts_index(input_table, input_id, *input_values, stemmer = 'porter',
stopwords = 'english', ignore = '(\\.|[^a-z])+',
strip_accents = 1, lower = 1, overwrite = 0)
PRAGMA 用于为指定表创建 FTS 索引。
| 名称 | 类型 | 描述 |
|---|---|---|
输入表 |
VARCHAR |
指定表的限定名称,例如 'table_name' 或 'main.table_name' |
输入ID |
VARCHAR |
文档标识符的列名,例如 'document_identifier' |
输入值... |
VARCHAR |
要索引的文本字段的列名(可变参数),例如 'text_field_1'、'text_field_2'、…、'text_field_N',或 '\*' 表示 input_table 中所有 VARCHAR 类型的列 |
词干提取器 |
VARCHAR |
要使用的词干提取器类型。以下之一:'arabic'、'basque'、'catalan'、'danish'、'dutch'、'english'、'finnish'、'french'、'german'、'greek'、'hindi'、'hungarian'、'indonesian'、'irish'、'italian'、'lithuanian'、'nepali'、'norwegian'、'porter'、'portuguese'、'romanian'、'russian'、'serbian'、'spanish'、'swedish'、'tamil'、'turkish',或者如果不需要词干提取,则为 'none'。默认为 'porter' |
停用词 |
VARCHAR |
包含单个 VARCHAR 列的表的限定名称,该列包含所需的停用词,或者如果不需要停用词,则为 'none'。默认为 'english',用于包含 571 个英语停用词的预定义列表 |
忽略 |
VARCHAR |
要忽略的模式的正则表达式。默认为 '(\\.|[^a-z])+',忽略所有转义的和非字母的小写字符 |
去除重音 |
BOOLEAN |
是否去除重音(例如,将 á 转换为 a)。默认为 1 |
小写 |
BOOLEAN |
是否将所有文本转换为小写。默认为 1 |
覆盖 |
BOOLEAN |
是否覆盖表中现有索引。默认为 0 |
此 PRAGMA 在新创建的模式下构建索引。该模式将以输入表命名:如果索引是在表 'main.table_name' 上创建的,则该模式将命名为 'fts_main_table_name'。
PRAGMA drop_fts_index
drop_fts_index(input_table)
删除指定表的 FTS 索引。
| 名称 | 类型 | 描述 |
|---|---|---|
输入表 |
VARCHAR |
输入表的限定名称,例如 'table_name' 或 'main.table_name' |
match_bm25 函数
match_bm25(input_id, query_string, fields := NULL, k := 1.2, b := 0.75, conjunctive := 0)
当索引构建完成后,会创建一个检索宏,可用于搜索该索引。
| 名称 | 类型 | 描述 |
|---|---|---|
输入ID |
VARCHAR |
文档标识符的列名,例如 'document_identifier' |
查询字符串 |
VARCHAR |
用于搜索索引的字符串 |
字段 |
VARCHAR |
要搜索的字段的逗号分隔列表,例如 'text_field_2, text_field_N'。默认为 NULL,表示搜索所有已索引的字段 |
k |
DOUBLE |
Okapi BM25 检索模型中的参数 k1。默认为 1.2 |
b |
DOUBLE |
Okapi BM25 检索模型中的参数 b。默认为 0.75 |
合取 |
BOOLEAN |
是否使查询为合取式,即查询字符串中的所有词项都必须存在才能检索到文档 |
stem 函数
stem(input_string, stemmer)
将单词还原为其基本形式。供扩展内部使用。
| 名称 | 类型 | 描述 |
|---|---|---|
输入字符串 |
VARCHAR |
要进行词干提取的列或常量。 |
词干提取器 |
VARCHAR |
要使用的词干提取器类型。以下之一:'arabic'、'basque'、'catalan'、'danish'、'dutch'、'english'、'finnish'、'french'、'german'、'greek'、'hindi'、'hungarian'、'indonesian'、'irish'、'italian'、'lithuanian'、'nepali'、'norwegian'、'porter'、'portuguese'、'romanian'、'russian'、'serbian'、'spanish'、'swedish'、'tamil'、'turkish',或者如果不需要词干提取,则为 'none'。 |
用法示例
创建表并填充文本数据
CREATE TABLE documents (
document_identifier VARCHAR,
text_content VARCHAR,
author VARCHAR,
doc_version INTEGER
);
INSERT INTO documents
VALUES ('doc1',
'The mallard is a dabbling duck that breeds throughout the temperate.',
'Hannes Mühleisen',
3),
('doc2',
'The cat is a domestic species of small carnivorous mammal.',
'Laurens Kuiper',
2
);
构建索引,使 text_content 和 author 两列均可搜索。
PRAGMA create_fts_index(
'documents', 'document_identifier', 'text_content', 'author'
);
在 author 字段索引中搜索由 Muhleisen 撰写的文档。这将检索到 doc1
SELECT document_identifier, text_content, score
FROM (
SELECT *, fts_main_documents.match_bm25(
document_identifier,
'Muhleisen',
fields := 'author'
) AS score
FROM documents
) sq
WHERE score IS NOT NULL
AND doc_version > 2
ORDER BY score DESC;
| 文档标识符 | 文本内容 | 分数 |
|---|---|---|
| doc1 | 绿头鸭是一种分布于温带地区的涉水鸭。 | 0.0 |
搜索关于 小型猫科动物 的文档。这将检索到 doc2
SELECT document_identifier, text_content, score
FROM (
SELECT *, fts_main_documents.match_bm25(
document_identifier,
'small cats'
) AS score
FROM documents
) sq
WHERE score IS NOT NULL
ORDER BY score DESC;
| 文档标识符 | 文本内容 | 分数 |
|---|---|---|
| doc2 | 猫是一种小型食肉哺乳动物的驯养种类。 | 0.0 |
警告 当输入表发生变化时,FTS 索引不会自动更新。此限制的解决方法是重新创建索引以进行刷新。