通过 Pigsty 原生 Linux 软件包、Docker 镜像、Debian/ZIP 归档包或源码编译安装 pg_tokenizer。
这是本节的多页打印视图。 .
pg_tokenizer 文档
- 1: 安装指南
- 2: 分词器架构与基本用法
- 3: 文本分析器与过滤器
- 4: 分词词表模型
- 5: 多语言分词配方与限制
- 6: SQL 与 TOML 参考
pg_tokenizer(由 Pigsty 在 pgsty/pg_tokenizer 维护)是一个使用 Rust(pgrx)构建的独立 PostgreSQL 多语言分词扩展。它提供可定制的文本分析器、字符与词元过滤器以及词表模型,可将原始文本转换为整数词元 ID 数组(INT[])及供 vchord_bm25 使用的稀疏 bm25vector 向量。
了解文本分析器(Text Analyzer)与词表模型(Model)如何协同工作,将原始文本转化为词元 ID。
配置字符过滤器、预分词器(Unicode、正则、结巴 Jieba)、词干提取器(支持 30 种语言)、停用词、同义词与 N-gram。
使用内置预训练模型(llmlingua2、bert_base_uncased、wiki_tocken、gemma2b)、训练自定义语料模型,或导入 HuggingFace 与 Lindera 模型。
面向英文、中文(Jieba)、日文(Lindera)及特定领域自定义语料库的开箱即用配置方案。
完整的 tokenizer_catalog SQL 函数签名与 TOML 配置参数参考手册。
1 - 安装指南
通过 pig 安装原生 Linux 软件包(推荐)
在 EL 8/9/10、Debian 12/13 与 Ubuntu 22.04/24.04(支持 PostgreSQL 14–18)上,可以直接从 Pigsty 软件仓库安装预构建的原生软件包(完整包可用性矩阵见 pgext.cloud):
使用 Docker(vchord-suite)
tensorchord/vchord-suite Docker 镜像已预装完整的 Vchord 检索扩展套件:
pg_tokenizer—— 独立多语言分词器(pgsty/pg_tokenizer)vchord_bm25—— 原生 BM25 排序索引(pgsty/vchord_bm25)vchord—— 可扩展、磁盘友好的向量相似性检索(pgsty/vchord)pgvector—— 标准 PostgreSQL 向量数据类型
使用 psql 连接数据库并启用扩展:
参数配置(shared_preload_libraries 与 search_path)
通过原生软件包或归档包安装时,请将 pg_tokenizer.so 加入 shared_preload_libraries(预加载词表模型所必需),并将 tokenizer_catalog 加入 search_path:
随后在目标数据库中创建扩展:
从 Debian 软件包或 ZIP 归档包安装
预编译的 .deb 与 .zip 发行包(要求 GLIBC >= 2.35,支持 x86_64 与 aarch64)可在 pgsty/pg_tokenizer Releases 页面下载:
从源码编译安装(cargo-pgrx)
升级到 0.1.2(未发布)
以下为 0.1.2 源码中的变更,尚未发布。安装匹配的动态库和 SQL 脚本后,先重启 PostgreSQL 以加载新的预加载库,再由扩展拥有者或管理员对各数据库执行:
0.1.0 与 0.1.1 均有升级路径。升级替换触发器及便捷函数定义,并授予目录权限,不重建自定义词表、不改变已有词元 ID,保留原六参函数的依赖关系。标准 cargo pgrx install/package 与 tools/package.sh 均会包含升级脚本。Lindera 字典版本变化引起的 ID 迁移仍须按照模型说明重新分词。
数据库拥有者权限
安装与升级向 pg_database_owner 授予 tokenizer_catalog 的 USAGE/CREATE、函数的 EXECUTE,目录表与模型表的 SELECT/INSERT/UPDATE/DELETE,以及序列的 USAGE/SELECT。安装角色以后在该模式中创建的表、序列和函数也有相同默认授权;新建自定义模型还会显式授权。授权随数据库拥有者变更而生效。
管理员安装扩展后,非超级用户的数据库拥有者可以创建、删除自己创建的模型、分析器、分词器、停用词及同义词。授权不转移对象所有权:删除其他角色创建的模型仍需原对象拥有者或管理员。其他应用角色需要显式授权;扩展不会向 PUBLIC 开放模式访问或目录写权限,函数继续以调用者权限执行。
2 - 分词器架构与基本用法
两阶段分词流水线
在 pg_tokenizer 中,一个分词器(tokenizer)最多由两个阶段组成,负责将原始 TEXT 字符串转换为由整数词元 ID 构成的 INT[] 数组:
flowchart LR
A["原始文本\n(TEXT)"] --> B["第一阶段:文本分析器 (Text Analyzer)\n1. character_filters(字符过滤器)\n2. pre_tokenizer(预分词器)\n3. token_filters(词元过滤器)"]
B --> C["归一化词元数组\n(TEXT[])"]
C --> D["第二阶段:模型 (Model)\n词表映射 / 子词 BPE"]
D --> E["词元 ID 数组\n(INT[] → bm25vector)"]- 文本分析器(
text_analyzer):按顺序应用以下三级流水线,将原始文本切分为归一化后的字符串词元数组TEXT[]:- 字符过滤器(
character_filters):在切分前对原始字符串进行整体转换(例如to_lowercase小写转换、unicode_normalizationUnicode 规范化)。 - 预分词器(
pre_tokenizer):将字符串初步切分为子串(支持unicode_segmentation、regex正则或中文jieba分词)。 - 词元过滤器(
token_filters):对单个词元进行过滤或转换(支持skip_non_alphanumeric、stemmer词干提取、stopwords停用词、synonym同义词、pg_dict、以及ngram)。
- 字符过滤器(
- 分词模型(
model):将归一化后的字符串词元(或对于llmlingua2、bert_base_uncased、gemma2b、HuggingFace 及lindera等独立子词模型,直接将原始文本)映射为整数词元 ID(INT[])。
- 预训练子词模型(
llmlingua2、bert_base_uncased、gemma2b)、HuggingFace 模型和 Lindera 模型已内置完整的分词规则,不需要(也不允许)配置单独的text_analyzer阶段。 - 词典/语料模型(
wiki_tocken以及通过create_custom_model创建的自定义模型)则必须搭配text_analyzer阶段,先完成文本切分与归一化,再去模型的词表(Vocabulary Table)中查找词元 ID。
创建与使用分词器
pg_tokenizer 中的所有配置均采用 TOML 格式,并通过美元符号引用的字符串($$ ... $$)传入。
方式一:单阶段分词器(使用内置模型)
方式二:内联文本分析器 + 模型
你可以直接在 create_tokenizer 内部定义 text_analyzer 流水线:
方式三:可复用的命名文本分析器 + 自定义模型
你可以使用 create_text_analyzer 先创建一个独立的命名 text_analyzer,随后在多个自定义模型和分词器之间复用它:
管理分词器
原生 PostgreSQL 全文检索(0.1.2,未发布)
analyze_to_tsvector 将文本分析器输出的字符串词元转换为 PostgreSQL 原生 tsvector,适合 Jieba 及自定义词干、停用词流水线。tokenize_to_tsvector 将模型输出的整数 ID 转为十进制词素,适用于内置、自定义、Hugging Face 和 Lindera 模型。它们不解码模型 ID,也不会再次使用 PostgreSQL 分词器归一化文本。
位置来自最终输出序列,默认权重为 D;它不代表原始文本偏移,因为过滤器会删除、展开或重排词元,模型也可能输出子词。引号、反斜杠、空白和标点会保留,空词元被忽略;空输出返回空向量,NULL 输入返回 NULL。
原生类型限制仍然适用:单个词素小于 2 KB,每个词素最多保存 256 个位置,超过 16,383 的位置被截到 16,383。长文本的词频与距离信息可能因此丢失,详见 PostgreSQL 全文检索限制。
文档与查询应使用相同分析器或模型、相同词素表示;plainto_tsquery('english', ...) 不会生成模型 ID,也不能复现自定义中文分析器。本次不增加文本搜索解析器或 tsquery 构造器。两个函数因读取目录配置而标记为 STABLE:先将结果存入列,再为该列创建 GIN/GiST 索引。接受原生 tsvector 的 BM25 实现也能使用这些值;迁移旧 bm25vector 索引前,应核对所安装 BM25 版本的 SQL API。
3 - 文本分析器与过滤器
文本分析器(Text Analyzer) 通过三个顺序阶段处理原始文本:
- 字符过滤器(
character_filters) —— 对完整输入字符串执行零个或多个字符级转换。 - 预分词器(
pre_tokenizer) —— 使用唯一的一个切分器将字符串切分为初始词元。 - 词元过滤器(
token_filters) —— 对切分出的词元执行零个或多个转换、扩展或过滤操作。
在将文本分析器绑定到模型之前,你可以直接运行 SELECT apply_text_analyzer('Sample text here', 'analyzer1'); 来测试并查看其输出的 TEXT[] 词元数组。
1. 字符过滤器(character_filters)
to_lowercase
将输入文本中的所有字符转换为小写。
unicode_normalization
应用 Unicode 规范化形式(UAX #15),将组合/分解字符、重音符号以及全角/半角变体标准化。
支持的模式包括:
"nfc"—— 规范化形式 C(标准分解后再执行标准组合)"nfd"—— 规范化形式 D(标准分解)"nfkc"—— 规范化形式 KC(兼容性分解后再执行标准组合)"nfkd"—— 规范化形式 KD(兼容性分解)
2. 预分词器(pre_tokenizer)
每个文本分析器最多只能指定一个 pre_tokenizer。
unicode_segmentation
按照 Unicode 标准附件 #29 (UAX #29) 规范(底层基于 Rust unicode-segmentation 库)在 Unicode 词边界处切分文本。非常适合以空格分隔的西方语言。
regex
提取匹配自定义正则表达式的词元(底层基于 Rust regex 库):
jieba(中文结巴分词)
使用 jieba-rs 词典与隐马尔可夫模型(HMM)将中文文本切分为词语:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
string |
"search" |
"full"(调用标准 jieba.cut 分词)、"precise"(调用 jieba.cut_all 扫描句中所有可成词的词语)或 "search"(搜索引擎模式,调用 jieba.cut_for_search 对长词再次切分以提高检索召回率)。 |
enable_hmm |
bool |
true |
是否启用 HMM 新词发现能力(仅在 "full" 和 "search" 模式下生效)。 |
3. 词元过滤器(token_filters)
词元过滤器会严格按照 TOML 数组中声明的顺序依次执行。
skip_non_alphanumeric
丢弃不包含任何字母或数字字符的词元(例如分词后残留的独立标点符号 ,、.、! 等)。
stemmer(Snowball 词干提取 —— 支持 30 种语言)
使用 Snowball 词干提取算法将屈折变化的单词还原为其词干形式。
支持的 stemmer 取值如下:
| 语言 | stemmer 取值 |
语言 | stemmer 取值 |
|---|---|---|---|
| 阿拉伯语 (Arabic) | arabic |
立陶宛语 (Lithuanian) | lithuanian |
| 亚美尼亚语 (Armenian) | armenian |
尼泊尔语 (Nepali) | nepali |
| 巴斯克语 (Basque) | basque |
挪威语 (Norwegian) | norwegian |
| 加泰罗尼亚语 (Catalan) | catalan |
葡萄牙语 (Portuguese) | portuguese |
| 丹麦语 (Danish) | danish |
罗马尼亚语 (Romanian) | romanian |
| 荷兰语 (Dutch) | dutch |
俄语 (Russian) | russian |
| 英语 (English Porter) | english_porter |
塞尔维亚语 (Serbian) | serbian |
| 英语 (English Porter2) | english_porter2 |
西班牙语 (Spanish) | spanish |
| 世界语 (Esperanto) | esperanto |
瑞典语 (Swedish) | swedish |
| 爱沙尼亚语 (Estonian) | estonian |
泰米尔语 (Tamil) | tamil |
| 芬兰语 (Finnish) | finnish |
土耳其语 (Turkish) | turkish |
| 法语 (French) | french |
意第绪语 (Yiddish) | yiddish |
| 德语 (German) | german |
||
| 希腊语 (Greek) | greek |
||
| 印地语 (Hindi) | hindi |
||
| 匈牙利语 (Hungarian) | hungarian |
||
| 印度尼西亚语 (Indonesian) | indonesian |
||
| 爱尔兰语 (Irish) | irish |
||
| 意大利语 (Italian) | italian |
stopwords(停用词过滤)
移除几乎不携带有效语义信号的常见停用词。
- 内置停用词典:
"lucene_english"—— Apache Lucene 标准英文停用词表"nltk_english"—— NLTK 标准英文停用词表"iso_english"—— Stopwords ISO 英文停用词表
- 自定义停用词典:通过
create_stopwords(name, text)创建(每行一个词),随后按名称引用。
synonym(同义词归一)
将同义词组归一化为同一个标准词元。使用 create_synonym(name, text) 创建同义词典,其中每行包含以空格分隔的一组同义词(同一行中的所有词都会被替换为该行的第一个词):
pg_dict(PostgreSQL 全文检索词典)
将词元过滤委托给任意已有的 PostgreSQL 全文检索词典(pg_ts_dict,支持 Simple、Ispell、Snowball 和 Synonym 词典;注意不支持 Thesaurus 分类词典,因为后者作用于多词短语而非单个词元):
ngram
将每个词元切分为字符级 N-gram(适用于子串匹配、前缀匹配、无词典 CJK 检索,或代码/标识符检索):
| 参数 | 类型 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|
min_gram |
int |
1 |
1..=255 (<= max_gram) |
生成 N-gram 的最小字符长度。 |
max_gram |
int |
2 |
1..=255 (>= min_gram) |
生成 N-gram 的最大字符长度。 |
preserve_original |
bool |
false |
true / false |
当原始词元长度不在 [min_gram, max_gram] 范围内时,是否同时保留未切分的原始词元。 |
4 - 分词词表模型
在 pg_tokenizer 中,模型(Model) 负责将字符串词元(或原始文本)映射为整数词元 ID(INT[])。你可以直接选用四个内置预训练模型、在 PostgreSQL 表上训练自定义词表模型、导入任意 HuggingFace tokenizer.json,或者使用 Lindera 形态学分析模型。
1. 内置预训练模型
| 模型名称 | 来源 / 架构 | 是否需要 text_analyzer? |
内存占用 | 适用场景 |
|---|---|---|---|---|
llmlingua2 |
microsoft/llmlingua-2-xlm-roberta-large-meetingbank(XLM-RoBERTa 多语言子词模型) |
否(禁止) | ~200 MB(默认预加载) | 开箱即用的多语言通用文本分词,无需训练自定义词表。 |
bert_base_uncased |
google-bert/bert-base-uncased(WordPiece,30,522 词表) |
否(禁止) | ~15 MB | 通用英文文本;启动极快且词表紧凑。 |
wiki_tocken |
Snowolf/wiki-tocken(内置英文维基百科词元词典) |
是(必需) | ~30 MB | 配合自定义词干提取器、停用词与同义词使用的英文全文检索。 |
gemma2b |
google/gemma-2b(SentencePiece BPE,256k 词表) |
否(禁止) | ~100 MB | 代码、技术标识符以及多语言大语言模型工作负载。 |
示例:使用 bert_base_uncased 或 llmlingua2
2. 自定义语料库模型(create_custom_model)
为了获得最高的 BM25 相关性精度与最小的内存占用,你可以直接基于自己的业务表列构建自定义词表模型。不同于大语言模型子词分词器(会将罕见的领域专有名词切碎为多个子词元),自定义模型会为 text_analyzer 产出的每个唯一归一化词元分配独立的 1:1 整数 ID,且在内存中仅占用几兆字节。
方式 A:一步到位辅助函数(create_custom_model_tokenizer_and_trigger)
该便捷函数会一步完成创建自定义模型、创建分词器、为所有存量行回填目标 bm25vector 列,并安装一个 BEFORE INSERT OR UPDATE 触发器——当数据行发生变化时,自动学习新词元并更新 bm25vector 列:
方式 B:分步创建(不使用触发器的 create_custom_model)
如果你不希望挂载自动触发器(或者希望自行控制何时计算并回填 embedding 列):
3. 导入 HuggingFace 分词器(create_huggingface_model)
你可以使用 create_huggingface_model 将任意 HuggingFace tokenizers 的 JSON 配置文件(tokenizer.json)导入 PostgreSQL。
在 psql 中,可以使用 \set 直接从 HuggingFace Hub 下载 tokenizer.json 到变量中并传给 create_huggingface_model:
也可以直接将 tokenizer.json 文件的完整内容作为美元符号引用的字符串传入:
4. Lindera 形态学分词模型(create_lindera_model)
对于日文、韩文、中文等需要形态学词典分析的东亚语言,pg_tokenizer 集成了 lindera。
使用 Lindera 6.2 构建时,原生词典配置为 [segmenter] 下的 dictionary = "embedded://ipadic"。目录表与预加载文件中已有的 [segmenter.dictionary] kind = "ipadic" 配置仍然兼容,旧格式的词典及用户词典 path 表也继续支持。外部编译词典需要使用 Lindera 6 重新构建。
Lindera 6.2 内嵌的 IPADIC 从 Lindera 0.42 使用的 2007-08-01 版升级到 2025-09-20 版,词元 ID 会变化。使用升级后的分词器查询前,请重新生成已存储的 Lindera 词元数组,并重建使用这些数组的索引。未知词仍然会被过滤。
如果你从源码编译 pg_tokenizer,请在编译时通过 --features 启用所需的 Lindera 词典特性:
以下完整示例展示了基于 ipadic 词典配置日文叠字符(Iteration Mark)规范化、NFKC Unicode 规范化、字符映射、复合词合并、数词归一化、日文停用词性(Stop-tags)过滤、片假名词干提取以及变音符号移除:
5. 模型预加载(add_preload_model)
大型模型(如约 200 MB 的 llmlingua2、约 100 MB 的 gemma2b、japanese_ipadic)在每个新建的 PostgreSQL 后端进程首次查询时,需要数秒钟时间和可观的内存来加载。通过在 shared_preload_libraries 启动阶段预加载模型,PostgreSQL 只需在 postmaster 主进程中加载一次模型,即可通过写时复制(Copy-on-Write)内存在所有后端连接之间共享(llmlingua2 默认已加入预加载列表):
调用 add_preload_model(...) 后(请确保已在 postgresql.conf 中设置 shared_preload_libraries = 'pg_tokenizer.so'),重启 PostgreSQL 即可使预加载对所有后端连接生效。
0.1.2 自定义模型更新(未发布)
词表触发器会去重、排序新词元,并在写入前获取按模型划分的事务级咨询锁,直到事务结束才释放。同一词表的写入在整个事务内串行执行,覆盖多行批次与多条语句,避免相反词元顺序导致的唯一索引死锁。普通分词读取及不同模型的写入仍可并发。请缩短事务;写入多个模型或锁定业务行时,仍需保持一致顺序并处理普通死锁、序列化失败重试。
生成 embedding 的触发器会在词表触发器完成后刷新 SPI 快照,因此在 READ COMMITTED 下可以读取等待期间由其他事务提交的词元 ID。在 REPEATABLE READ 或 SERIALIZABLE 下,冲突的写事务可能收到 SQLSTATE 40001,需要重试整个事务。升级保留已有词表 ID;新模型的 ID 属于内部映射,不保证与独立创建的其他模型相同。
按条件选择语料
filter 是使用源表列名的 SQL 布尔表达式,不带 WHERE 或 NEW.,按调用者权限求值。仅 TRUE 匹配,FALSE 和 NULL 均跳过;空表达式或非法表达式即使面对空表也会报错。条件应由普通源列确定,不应依赖 embedding 目标列;不支持 ctid 等系统列及非确定性条件。应传入可信表达式,必要时为函数加上模式限定。该功能用于选择语料,不能替代行级安全策略。
过滤条件同时作用于初始词表扫描、embedding 回填和后续插入/更新。配置过滤条件后,触发器监听所有 UPDATE,因此只修改租户字段也会重新判断。匹配行的源文本变为 NULL 时,embedding 同步设为 NULL。
不匹配行保持原值,包括已有 embedding;行退出语料范围后,不会删除其原 embedding 或词表条目。查询时应使用相同过滤条件,或由应用清空排除行的 embedding。词表只增不减,UPDATE/DELETE 不会裁剪词表。省略 filter 或向便捷函数传入 SQL NULL,仍处理整张表。原六参调用与旧模型配置兼容,并支持带模式的表名及含特殊字符的列名。
带模式的表名优先按限定名解析;如需选择名称本身含点号的表,请使用 SQL 双引号,例如 '"corpus.docs"'。
5 - 多语言分词配方与限制
本页提供可直接用于生产环境的英文、中文和日文全文 BM25 检索分词配置配方,并列出在实际运维中需要注意的关键限制事项。
配方一:带词干提取与停用词过滤的英文检索(wiki_tocken)
将 Unicode 词边界切分、NLTK 停用词过滤、Porter2 词干提取与内置维基百科词表(wiki_tocken)结合使用:
配方二:带自动触发器的英文自定义语料库模型
源自上游 pg_tokenizer 示例文档,该工作流直接基于 documents 表构建特定领域的英文词表,并通过触发器自动同步更新词频向量:
配方三:中文全文检索(jieba + 自定义模型)
处理中文文本时,推荐将 jieba 预分词器(mode = "search",enable_hmm = true)与基于业务表训练的自定义语料词表模型结合使用(以下示例采用钱钟书《围城》选段作为测试语料):
配方四:日文全文检索(lindera IPADIC)
从 Lindera 0.42 升级到 6.2 时,IPADIC 词元 ID 会变化,需要重新生成已存储的词元数组并重建相关索引。下方的词典配置仍然兼容,详见 Lindera 升级说明。
处理日文文本时,可创建基于 Lindera IPADIC 的形态学分词模型,并配置叠字符规范化、NFKC 规范化、日文停用词性(Stop-tags)过滤以及片假名词干提取(以下示例采用夏目漱石《吾輩は猫である》选段作为测试语料):
运维注意事项与已知限制
- 对象名称命名规范:所有分词器、文本分析器、模型、停用词典和同义词典的名称只能包含字母、数字和下划线(
[A-Za-z0-9_]),且不能以数字开头。 - 事务回滚与会话级内存对象缓存:每个 PostgreSQL 后端连接都会在进程内存(
DashMap)中缓存tokenizer、text_analyzer、model、stopwords和synonym对象。由于该内存对象池未挂载到 PostgreSQL 事务回滚回调机制上,当事务执行ROLLBACK时,磁盘上的tokenizer_catalog元数据表会回滚,但当前连接的内存缓存中仍会残留刚才创建的对象。在ROLLBACK之后,请显式调用对应的drop_*函数(或重新建立数据库连接)以清理内存缓存: - 只读从库上的模型预加载:
add_preload_model会将预加载模型列表写入主节点本地的$PGDATA/pg_tokenizer目录。由于 PostgreSQL 关系表以外的文件系统文件不会通过 WAL 日志复制到从库,如果你在只读从库上也需要预加载模型,请在从库上独立执行一次add_preload_model。 - 内置大语言模型分词器的内存开销:
llmlingua2(~200 MB)、gemma2b(~100 MB)和lindera等模型会占用较多内存。在生产环境中,请务必使用add_preload_model让模型在 postmaster 主进程中仅加载一次,避免在每个连接中重复占用内存;或者优先选用仅占用几兆字节内存的自定义语料模型(create_custom_model)。
6 - SQL 与 TOML 参考
SQL 函数参考(tokenizer_catalog)
文本分析器与词典管理
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
tokenizer_catalog.create_text_analyzer(name TEXT, config TEXT) |
VOID |
根据 TOML 配置字符串创建命名文本分析器流水线。 |
tokenizer_catalog.drop_text_analyzer(name TEXT) |
VOID |
按名称删除文本分析器。 |
tokenizer_catalog.apply_text_analyzer(text TEXT, text_analyzer_name TEXT) |
TEXT[] |
使用指定文本分析器切分并过滤 text,返回词元数组以供调试预览。 |
tokenizer_catalog.create_stopwords(name TEXT, config TEXT) |
VOID |
创建自定义停用词词典(每行一个停用词)。 |
tokenizer_catalog.drop_stopwords(name TEXT) |
VOID |
删除自定义停用词词典。 |
tokenizer_catalog.create_synonym(name TEXT, config TEXT) |
VOID |
创建自定义同义词词典(每行一组以空格分隔的同义词,统一映射为首词)。 |
tokenizer_catalog.drop_synonym(name TEXT) |
VOID |
删除自定义同义词词典。 |
分词模型与预加载管理
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
tokenizer_catalog.create_custom_model(name TEXT, config TEXT) |
VOID |
基于现有数据表列构建自定义词表模型。 |
tokenizer_catalog.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 |
一键创建自定义词表模型与分词器,回填 target_column,并在 source_column 上安装自动更新触发器。 |
tokenizer_catalog.drop_custom_model(name TEXT) |
VOID |
删除自定义词表模型。 |
tokenizer_catalog.create_huggingface_model(name TEXT, config TEXT) |
VOID |
导入 HuggingFace tokenizer.json 模型定义。 |
tokenizer_catalog.drop_huggingface_model(name TEXT) |
VOID |
删除已导入的 HuggingFace 模型。 |
tokenizer_catalog.create_lindera_model(name TEXT, config TEXT) |
VOID |
根据 TOML 配置创建 Lindera 形态学分词模型。 |
tokenizer_catalog.drop_lindera_model(name TEXT) |
VOID |
删除 Lindera 模型。 |
tokenizer_catalog.add_preload_model(name TEXT) |
VOID |
将模型加入共享内存预加载列表(重启 PostgreSQL 后生效)。 |
tokenizer_catalog.remove_preload_model(name TEXT) |
VOID |
将模型移出预加载列表。 |
tokenizer_catalog.list_preload_models() |
TEXT[] |
列出当前已注册预加载的所有模型名称。 |
分词器执行函数
| 函数签名 | 返回类型 | 说明 |
|---|---|---|
tokenizer_catalog.create_tokenizer(name TEXT, config TEXT) |
VOID |
创建分词器(组合可选的 text_analyzer 与必选的 model)。 |
tokenizer_catalog.drop_tokenizer(name TEXT) |
VOID |
按名称删除分词器。 |
tokenizer_catalog.tokenize(text TEXT, tokenizer_name TEXT) |
INT[] |
将 text 分词为整数词元 ID 数组(可隐式转换为 bm25vector)。 |
TOML 配置参数参考
text_analyzer 配置项
| 键名 | 类型 | 说明 |
|---|---|---|
character_filters |
表数组 / 字符串数组 | 字符级过滤转换(to_lowercase、unicode_normalization = "nfc" | "nfd" | "nfkc" | "nfkd")。 |
pre_tokenizer |
表 / 字符串 | 初始分词切分器(unicode_segmentation、regex = "..." 或 jieba)。 |
token_filters |
表数组 / 字符串数组 | 词元级过滤器(skip_non_alphanumeric、stemmer、stopwords、synonym、pg_dict、ngram)。 |
tokenizer 配置项
| 键名 | 类型 | 说明 |
|---|---|---|
text_analyzer |
字符串 | 已创建的 text_analyzer 名称(或内联 [text_analyzer] 表)。使用独立子词模型时无需配置。 |
model |
字符串 | 内置预训练模型(llmlingua2、bert_base_uncased、wiki_tocken、gemma2b)或自定义/HuggingFace/Lindera 模型名称。 |
custom_model 配置项
| 键名 | 类型 | 说明 |
|---|---|---|
table |
字符串 | 存放训练语料的数据表名称。 |
column |
字符串 | 存放原始文本的 TEXT 列名称。 |
text_analyzer |
字符串 | 用于提取词表词元的 text_analyzer 名称。 |
0.1.2 新增接口(未发布)
| 接口 | 返回类型 | 行为 |
|---|---|---|
tokenizer_catalog.analyze_to_tsvector(text TEXT, text_analyzer_name TEXT) |
TSVECTOR |
将分析器输出的字符串词元转换为带位置的原生词素。 |
tokenizer_catalog.tokenize_to_tsvector(text TEXT, tokenizer_name TEXT) |
TSVECTOR |
将模型输出的词元 ID 转为十进制词素,保留输出位置。 |
两个函数均为 STABLE;先存入列,再为该列创建 GIN/GiST 索引。文档与查询必须采用相同的词素表示,详见原生全文检索。
create_custom_model 的 TOML 配置新增可选字符串 filter,内容为源表列上的 SQL 布尔表达式,不包含 WHERE 或 NEW.。create_custom_model_tokenizer_and_trigger 新增七参重载,最后一参为 filter TEXT;原六参调用继续可用,省略过滤条件或传入 SQL NULL 表示选取全部行。table 支持带模式名的表名。详见过滤与并发语义。