⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
全文搜索扩展

全文搜索是 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_contentauthor 两列均可搜索。

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