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. 分类词典配置
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. 分类词典示例
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;最早采样版本不一定是实际引入版本。