全文搜索是 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 索引不会自动更新。此限制的解决方法是重新创建索引以进行刷新。