SQL 参考手册
vchord_bm25 与 pg_tokenizer 的完整 SQL 数据类型、操作符、类型转换、索引访问方法与函数参考。
重要
当前源码面向 0.4.0(尚未发布),使用原生 tsvector 和新的索引格式。标注 0.3.x 的 bm25vector 示例仅适用于旧版。两者不能原地升级;请先阅读0.4.0 迁移指南。
vchord_bm25 数据类型
| 数据类型 | 所属模式 | 适用版本 | 文本表示形式 / 内部结构 | 说明 |
|---|---|---|---|---|
bm25vector |
bm25_catalog |
v0.1.0 – v0.3.0 |
{token_id:freq, ...}(例如 {1:1, 2:2, 15:1}) |
将 32 位无符号词元 ID 映射为 32 位词频的稀疏向量。存储策略为 STORAGE = EXTERNAL。 |
bm25query |
bm25_catalog |
v0.1.0 – v0.3.0 |
(index_oid regclass, query_vector bm25vector) |
将目标 bm25 索引 OID 与查询 bm25vector 配对的复合类型。 |
bm25query |
public / 扩展模式 |
0.4.0 / main |
(vector tsvector, index regclass) |
将查询 tsvector 与目标 bm25 索引 OID 配对的复合类型。 |
bm25vector 字面量语法(v0.1 – v0.3)
vchord_bm25 操作符
| 操作符 | 左操作数 | 右操作数 | 返回类型 | 适用版本 | 说明 |
|---|---|---|---|---|---|
<&> |
bm25vector |
bm25query |
real (f32) |
v0.1.0 – v0.3.0 |
计算负值 BM25 相关性得分($-\text{BM25}(D, Q)$)。支持使用 bm25_ops 执行索引加速的 ORDER BY ... ASC 扫描。 |
<&> |
tsvector |
bm25query |
float8 (f64) |
0.4.0 / main |
在原生 tsvector 上计算负值 BM25 相关性得分。支持使用 bm25_ops 执行索引加速的 ORDER BY ... ASC 扫描。 |
= |
bm25vector |
bm25vector |
bool |
v0.2.0 – v0.3.0 |
比较两个 bm25vector 值是否完全相等。 |
<> |
bm25vector |
bm25vector |
bool |
v0.2.0 – v0.3.0 |
比较两个 bm25vector 值是否不相等。 |
vchord_bm25 函数
| 函数签名 | 返回类型 | 适用版本 | 说明 |
|---|---|---|---|
to_bm25query(index_oid regclass, query_vector bm25vector) |
bm25query |
v0.1.1 – v0.3.0 |
根据 bm25 索引名称/OID 与查询 bm25vector(或经由隐式转换的 INT[])构造 bm25query。 |
to_bm25query(index_oid regclass, query_vector int[]) |
bm25query |
v0.3.0 |
直接接受 INT[] 词元 ID 数组的显式重载函数。 |
to_bm25query(vector tsvector, index regclass) |
bm25query |
0.4.0 / main |
根据原生 tsvector 与目标 bm25 索引名称/OID 构造 bm25query。 |
search_bm25query(target_vector bm25vector, query bm25query) |
real |
v0.1.0 – v0.3.0 |
bm25vector <&> bm25query 操作符的底层实现函数。 |
_bm25_evaluate(left tsvector, right bm25query) |
float8 |
0.4.0 / main |
tsvector <&> bm25query 操作符的底层实现函数。 |
bm25_page_inspect(index regclass, blkno int) |
text |
v0.3.0 |
返回 bm25 索引第 blkno 号数据块的可读诊断元数据。 |
vchord_bm25 访问方法与操作符类
| 对象类型 | 名称 | 目标类型 | 排序操作符 |
|---|---|---|---|
| 访问方法 (Access Method) | bm25 |
索引 (Index) | 0.4.0 处理器为 bm25_amhandler;0.3.x 为 _bm25_amhandler |
| 操作符族 (Operator Family) | bm25_ops |
USING bm25 |
<&> 位于扩展模式(0.4.0)或 pg_catalog(0.3.x),按 float_ops 排序 |
| 操作符类 (Operator Class) | bm25_ops |
bm25vector(v0.1–v0.3)/ tsvector(main) |
USING bm25 的显式操作符类 |
pg_tokenizer 函数(tokenizer_catalog)
所有 pg_tokenizer 函数均位于 tokenizer_catalog 模式中:
分词器管理与执行
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
create_tokenizer(name TEXT, config TEXT) |
void |
根据 TOML 配置字符串创建一个命名分词器。 |
drop_tokenizer(name TEXT) |
void |
删除已有的分词器。 |
tokenize(text TEXT, tokenizer_name TEXT) |
INT[] |
使用 tokenizer_name 对 text 进行分词,返回整数词元 ID 数组(可隐式转换为 bm25vector)。 |
文本分析器管理
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
create_text_analyzer(name TEXT, config TEXT) |
void |
创建可复用的命名文本分析器流水线(包含 character_filters、pre_tokenizer、token_filters)。 |
drop_text_analyzer(name TEXT) |
void |
删除指定的命名文本分析器。 |
apply_text_analyzer(text TEXT, text_analyzer_name TEXT) |
TEXT[] |
对 text 运行指定的文本分析器,返回归一化后的字符串词元数组(常用于调试分词效果)。 |
模型管理
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
create_custom_model(name TEXT, config TEXT) |
void |
使用指定的文本分析器,在现有表列上训练自定义词表模型。 |
drop_custom_model(name TEXT) |
void |
删除自定义模型及其底层词表数据表。 |
create_custom_model_tokenizer_and_trigger(tokenizer_name TEXT, model_name TEXT, text_analyzer_name TEXT, table_name TEXT, source_column TEXT, target_column TEXT) |
void |
一步创建自定义模型与分词器,回填 table_name 表中的 target_column 列,并绑定自动 BEFORE INSERT OR UPDATE 触发器。 |
create_huggingface_model(name TEXT, config TEXT) |
void |
从 HuggingFace tokenizer.json 字符串导入模型。 |
drop_huggingface_model(name TEXT) |
void |
删除已导入的 HuggingFace 模型。 |
create_lindera_model(name TEXT, config TEXT) |
void |
根据 TOML 配置创建 Lindera 形态学分析模型(如 ipadic)。 |
drop_lindera_model(name TEXT) |
void |
删除 Lindera 模型。 |
词典与预加载管理
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
create_stopwords(name TEXT, config TEXT) |
void |
创建自定义停用词典(每行一个停用词)。 |
drop_stopwords(name TEXT) |
void |
删除自定义停用词典。 |
create_synonym(name TEXT, config TEXT) |
void |
创建自定义同义词典(每行以空格分隔一组同义词,统一映射到该行第一个词)。 |
drop_synonym(name TEXT) |
void |
删除自定义同义词典。 |
add_preload_model(name TEXT) |
void |
注册在 PostgreSQL 服务启动(shared_preload_libraries)时预加载的模型。 |
remove_preload_model(name TEXT) |
void |
从启动预加载列表中移除指定模型。 |
list_preload_models() |
TEXT[] |
返回当前已注册为启动预加载的所有模型名称列表。 |
内部触发器与辅助函数(tokenizer_catalog)
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
apply_text_analyzer_for_custom_model(text TEXT, text_analyzer_name TEXT) |
TEXT[] |
调用 text_analyzer_name 分词,并在写入自定义模型词表前自动过滤掉长度超过 2600 字节(PostgreSQL B-tree UNIQUE 索引键最大长度限制)的超长词元。 |
custom_model_insert_trigger() |
trigger |
AFTER INSERT OR UPDATE 触发器函数,从源文本列提取词元并将新出现的词元自动追加写入 tokenizer_catalog."model_<name>" 词表。 |
custom_model_tokenizer_set_target_column_trigger() |
trigger |
由 create_custom_model_tokenizer_and_trigger 安装的 BEFORE INSERT OR UPDATE 触发器函数,自动执行 NEW.<target_column> = tokenize(NEW.<source_column>, tokenizer_name)。 |
pg_tokenizer 元数据表(tokenizer_catalog)
| 表名 | 列定义 | 说明 |
|---|---|---|
tokenizer_catalog.tokenizer |
name TEXT NOT NULL UNIQUE, config TEXT NOT NULL |
存储已注册的分词器名称及其序列化后的 JSON/TOML 配置。 |
tokenizer_catalog.text_analyzer |
name TEXT NOT NULL UNIQUE, config TEXT NOT NULL |
存储独立命名且可复用的文本分析器定义。 |
tokenizer_catalog.model |
name TEXT NOT NULL UNIQUE, config TEXT NOT NULL |
存储已注册的自定义模型、HuggingFace 模型与 Lindera 模型定义。 |
tokenizer_catalog.stopwords |
name TEXT NOT NULL PRIMARY KEY, config TEXT NOT NULL |
存储内置(lucene_english、nltk_english、iso_english)及自定义停用词典。 |
tokenizer_catalog.synonym |
name TEXT NOT NULL PRIMARY KEY, config TEXT NOT NULL |
存储自定义同义词典。 |
tokenizer_catalog."model_<name>" |
id SERIAL PRIMARY KEY, token TEXT NOT NULL UNIQUE |
为每个自定义模型 <name> 自动创建的底层词表数据表,将唯一归一化词元映射为从 1 开始的自增整数 ID。 |
pg_tokenizer TOML 配置参数参考
分词器配置项(create_tokenizer)
| 参数名 | 类型 | 说明 |
|---|---|---|
text_analyzer |
string(可选) |
预先创建的命名 text_analyzer 名称。若省略,可在支持文本分析器的模型中直接内联定义 character_filters、pre_tokenizer 和 token_filters。 |
model |
string(必填) |
内置模型(llmlingua2、bert_base_uncased、wiki_tocken、gemma2b)或用户创建的模型(custom、huggingface、lindera)名称。 |
文本分析器配置项(create_text_analyzer)
| 参数名 | 类型 | 说明 |
|---|---|---|
character_filters |
array / table |
在分词前对整段字符串依次应用的字符过滤器列表:to_lowercase、unicode_normalization(nfc、nfd、nfkc、nfkd)。 |
pre_tokenizer |
string / table |
将字符串切分为初始词元的单个预分词器:unicode_segmentation、regex(Rust 正则表达式)或 jieba(mode = "full" | "precise" | "search",enable_hmm = true | false)。 |
token_filters |
array |
按顺序执行的词元过滤器列表:skip_non_alphanumeric、stemmer(支持 30 种 Snowball 词干提取器)、stopwords(内置 lucene_english、nltk_english、iso_english 或自定义停用词典)、synonym、pg_dict(除 Thesaurus 外的任意 pg_ts_dict 词典)、ngram(min_gram、max_gram 范围 1..=255,preserve_original)。 |
自定义模型配置项(create_custom_model)
| 参数名 | 类型 | 说明 |
|---|---|---|
table |
string(必填) |
包含源文本语料的目标表名称。 |
column |
string(必填) |
table 表中用于构建词表的源 TEXT 列名称。 |
text_analyzer |
string(必填) |
用于将 column 列切分为词表词元的 text_analyzer 名称。 |