↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 全文检索组件 / 词典模板

thesaurus

thesaurus 词典:逐短语替换

当前查看 PostgreSQL 18.6。

说明

thesaurus 词典:逐短语替换

模板名称(tmplname)
thesaurus
初始化函数(tmplinit)
thesaurus_init
词法化函数(tmpllexize)
thesaurus_lexize

手册定义

词组词典(有时缩写为 TZ)是一组包含词语及短语之间关系信息的词汇集合,例如上位词(BT)、下位词(NT)、首选词、非首选词、相关词等。

分类词典基本上会用一个首选词替换所有非首选词,并且也可以选择保留原始词用于索引。PostgreSQL的分类词典的当前实现是同义词词典的一个扩展,并增加了短语支持。一个分类词典需要一个采用以下格式的配置文件:

# this is a comment
sample word(s) : indexed word(s)
more sample word(s) : more indexed word(s)
...

其中冒号(:)符号用作短语及其替换词之间的分隔符。

分类词典会使用一个子词典(在词典配置中指定)在检查短语匹配之前正规化输入文本。只能选择一个子词典。如果子词典无法识别某个词,就会报错。在这种情况下,你应当避免使用该词,或者让子词典学会它。你可以在某个被索引词的开头放置一个星号(*),以跳过将子词典应用于该词,但所有样例词都必须能被子词典识别。

如果有多个短语匹配输入,分类词典会选择最长的匹配;长度相同时使用最后的定义。

由子词典识别的特定停用词不能够被指定;改用?标记可出现任意停用词的位置。例如,假定根据子词典a和the是停用词:

? one ? two : swsw

匹配a one the two和the one a two;两者都将被swsw替换。

由于分类词典具备识别短语的能力,因此它必须记住自身状态并与解析器交互。分类词典会利用这些映射关系来判断自己是应当处理下一个词,还是停止累积。分类词典必须经过仔细配置。例如,如果分类词典只被映射到 asciiword 词元,那么像 one 7 这样的分类词典定义就无法工作,因为词元类型 uint 并没有映射给该分类词典。

小心

分类词典会在建立索引时使用,因此其参数发生任何变化都要求重新建立索引。对于大多数其他词典类型,像增加或移除停用词这样的细小改动则不会强制重新建立索引。

12.6.4.1. 分类词典配置

要定义一个新的分类词典,可使用thesaurus模板。例如:

CREATE TEXT SEARCH DICTIONARY thesaurus_simple (
    TEMPLATE = thesaurus,
    DictFile = mythesaurus,
    Dictionary = pg_catalog.english_stem
);

这里:

  • thesaurus_simple是新词典的名称

  • mythesaurus是分类词典配置文件的基名(它的全名将是$SHAREDIR/tsearch_data/mythesaurus.ths,其中$SHAREDIR表示安装的共享数据目录)。

  • pg_catalog.english_stem是要用于分类词典正规化的子词典(这里是一个 Snowball 英语词干分析器)。注意子词典将拥有它自己的配置(例如停用词),但这里没有展示。

现在可以在配置中把分类词典thesaurus_simple绑定到想要的词元类型上,例如:

ALTER TEXT SEARCH CONFIGURATION russian
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
    WITH thesaurus_simple;

12.6.4.2. 分类词典示例

考虑一个简单的天文分类词典 thesaurus_astro,其中包含一些天文单词组合:

supernovae stars : sn
crab nebulae : crab

下面我们创建一个词典,并把一些词元类型绑定到天文分类词典和英语词干分析器上:

CREATE TEXT SEARCH DICTIONARY thesaurus_astro (
    TEMPLATE = thesaurus,
    DictFile = thesaurus_astro,
    Dictionary = english_stem
);

ALTER TEXT SEARCH CONFIGURATION russian
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
    WITH thesaurus_astro, english_stem;

现在我们可以看看它是如何工作的。ts_lexize 对测试分类词典并不十分有用,因为它把输入当作一个单独的词元。相反,我们可以使用 plainto_tsquery 和 to_tsvector,它们会把输入字符串拆分成多个词元:

SELECT plainto_tsquery('supernova star');
 plainto_tsquery
-----------------
 'sn'

SELECT to_tsvector('supernova star');
 to_tsvector
-------------
 'sn':1

原则上,如果把参数用引号括起来,也可以使用 to_tsquery:

SELECT to_tsquery('''supernova star''');
 to_tsquery
------------
 'sn'

在 thesaurus_astro 中,supernova star 能匹配 supernovae stars,因为词组词典定义中指定了 english_stem 词干提取器;它去掉了 e 和 s。

如果既要为替换词建立索引,也要为原始短语建立索引,只需把原始短语也写到定义右侧即可:

supernovae stars : sn supernovae stars

SELECT plainto_tsquery('supernova star');
       plainto_tsquery
-----------------------------
 'sn' & 'supernova' & 'star'

文档与源码

来源构建
版本
18.6
构建
https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

版本比较

PostgreSQL 17 → 18: 无变化。

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

相关条目

导出 JSON · 返回全文检索组件 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。