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