⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Full-Text Search Extension

全文搜索是DuckDB的一个扩展,允许通过字符串进行搜索,类似于SQLite的FTS5扩展

Installing and Loading

fts 扩展将在首次使用时从官方扩展仓库中自动加载。 如果您希望手动安装并加载它,请运行:

INSTALL fts;
LOAD fts;

Usage

该扩展为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索引。

Name Type Description
input_table VARCHAR 指定表的限定名称,例如,'table_name''main.table_name'
input_id VARCHAR 文档标识符的列名,例如 'document_identifier'
input_values… VARCHAR 要索引的文本字段的列名(可变参数),例如 'text_field_1', 'text_field_2', …, 'text_field_N', 或者 '\*' 表示输入表中所有类型为 VARCHAR 的列
stemmer 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'
stopwords VARCHAR 包含单个VARCHAR列的表的限定名称,该列包含所需的停用词,或者如果不需要使用停用词,则为'none'。默认为'english',表示预定义的571个英文停用词列表
ignore VARCHAR 要忽略的模式的正则表达式。默认为 '(\\.|[^a-z])+',忽略所有转义和非字母的小写字符
strip_accents BOOLEAN 是否去除重音符号(例如,将 á 转换为 a)。默认为 1
lower BOOLEAN 是否将所有文本转换为小写。默认为 1
overwrite BOOLEAN 是否覆盖表上现有的索引。默认为 0

这个PRAGMA在新创建的架构下构建索引。架构将根据输入表命名:如果在表'main.table_name'上创建索引,则架构将被命名为'fts_main_table_name'

PRAGMA drop_fts_index

drop_fts_index(input_table)

删除指定表的FTS索引。

Name Type Description
input_table VARCHAR 输入表的限定名称,例如 'table_name''main.table_name'

match_bm25 函数

match_bm25(input_id, query_string, fields := NULL, k := 1.2, b := 0.75, conjunctive := 0)

当索引被构建时,会创建这个检索宏,可以用来搜索索引。

Name Type Description
input_id VARCHAR 文档标识符的列名,例如 'document_identifier'
query_string VARCHAR 用于搜索索引的字符串
fields VARCHAR 要搜索的字段的逗号分隔列表,例如 'text_field_2, text_field_N'。默认为 NULL 以搜索所有索引字段
k DOUBLE Okapi BM25 检索模型中的参数 k1。默认为 1.2
b DOUBLE Okapi BM25 检索模型中的参数 b。默认为 0.75
conjunctive BOOLEAN 是否使查询为联合查询,即查询字符串中的所有术语都必须存在才能检索到文档

stem 函数

stem(input_string, stemmer)

将单词还原为其基本形式。由扩展内部使用。

Name Type Description
input_string VARCHAR 要进行词干提取的列或常量。
stemmer 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

搜索关于small cats的文档。这将检索到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索引不会自动更新。 解决此限制的一个方法是重新创建索引以刷新。