CREATE TEXT SEARCH DICTIONARY
功能描述
创建一个新的全文检索词典。词典是一种指定在全文检索时识别特定词并处理的方法。
词典的创建依赖于预定义模板(在系统表PG_TS_TEMPLATE中定义),支持创建五种类型的词典,分别是Simple、Ispell、Synonym、Thesaurus以及Snowball,每种类型的词典可以完成不同的任务。
注意事项
- 具有SYSADMIN权限的用户可以执行创建词典操作,创建该词典的用户自动成为其所有者。
- 临时模式(pg_temp)下不允许创建词典。
- 创建或修改词典之后,任何对于用户自定义的词典定义文件的修改,将不会影响到数据库中的词典。如果需要在数据库中使用这些修改,需使用ALTER语句更新对应词典的定义文件。
语法格式
1 2 3 4 |
CREATE TEXT SEARCH DICTIONARY name ( TEMPLATE = template [, option = value [, ... ]] ); |
参数说明
- name
要创建的词典的名称(可指定模式名,否则在当前模式下创建)。
取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。
- template
模板名。
取值范围:系统表PG_TS_TEMPLATE中定义的模板:Simple/Synonym/Thesaurus/Ispell/Snowball。
- option
参数名。与template值对应,不同的词典模板具有不同的参数列表,且与指定顺序无关。
- Simple词典对应的option
- STOPWORDS
停用词表文件名,默认后缀名为stop。例如STOPWORDS = french,则实际文件名为french.stop。停用词文件格式为一组word列表,每行定义一个停用词。词典处理时,文件中的空行和空格会被忽略,并将stopword词组转换为小写形式。
- ACCEPT
是否将非停用词设置为已识别。默认值为true。
当Simple词典设置参数ACCEPT=true时,将不会传递任何token给后继词典,此时建议将其放置在词典列表的最后。反之,当ACCEPT=false时,建议将该Simple词典放置在列表中的至少一个词典之前。
- FILEPATH
停用词文件所在目录。停用词文件可以存放于本地,也可以存放于对象存储服务OBS服务器。如果存在本地,目录格式为'file://absolute_path'。如果存放于OBS服务器,目录格式为'obs://bucket/path accesskey=ak secretkey=sk region=region_name'。注意目录要用单引号包含。默认值为预定义词典文件所在目录。FILEPATH参数必须和STOPWORDS参数同时指定,不允许单独指定。
使用OBS服务器上的停用词文件创建字典的过程如下:
- 将停用词文件上传到OBS服务器。例如将french.stop文件上传到OBS服务器obsv3.sa-fb-1.externaldemo.com上名为gaussdb的桶中,其URL为https://gaussdb.obsv3.sa-fb-1.externaldemo.com/french.stop。上传文件及查询URL的方式请参考OBS用户手册。
- 修改$GAUSSHOME/etc/region_map文件,在其中加入一行"region_name": "obs domain"。region_name可以为任意由大小写字母、数字、斜杠(/)或下划线组成的字符串。obs domain为OBS服务器的域名。
示例,将region_name设为rg,region_map包含的内容如:"rg": "obsv3.sa-fb-1.externaldemo.com"。
region_name和obs domain都用双引号,冒号的左边没有空格,右边有1个空格。
- 执行CREATE TEXT SEARCH DICTIONARY命令创建字典。命令如下:
1
CREATE TEXT SEARCH DICTIONARY french_dict ( TEMPLATE = pg_catalog.simple, STOPWORDS = french, FILEPATH = 'obs://gaussdb accesskey=xxx secretkey=yyy region=rg' );
由于french.stop文件放在gaussdb桶的根目录下,因此path为空。
- STOPWORDS
- Synonym词典对应的option
- SYNONYM
同义词词典的定义文件名,默认后缀名为syn。
文件格式为一组同义词列表,每行格式为"token synonym",即token和其对应的synonym,中间以空格相连。
- CASESENSITIVE
设置是否大小写敏感,默认值为false,此时词典文件中的token和synonym均会转为小写形式处理。如果设置为true,则不会进行小写转换。
- FILEPATH
同义词词典文件所在目录。目录可以指定为本地目录和OBS目录两种形式。默认值为预定义词典文件所在目录。其中目录格式、以及使用OBS服务器上的文件创建Synonym字典的过程与Simple词典的FILEPATH相同。
- SYNONYM
- Thesaurus词典对应的option
- DICTFILE
词典定义文件名,默认后缀名为ths。
文件格式为一组同义词列表,每行格式为"sample words : indexed words",中间冒号(:)作为短语和其替换词间的分隔符。TZ词典处理时,如果有多个匹配的sample words,将选择最长匹配输出。
- DICTIONARY
用于词规范化的子词典名,必须且仅能定义一个。该词典必须是已经存在的,在检查短语匹配之前使用,用于识别和规范输入文本。
如果子词典无法识别输入词,将会报错。此时,需要移除该词或者更新子词典使其识别。此外,可在indexed words的开头放上一个星号(*)来跳过在其上应用子词典,但是所有sample words必须可以被子词典识别。
如果词典文件定义的sample words中,含有子词典中定义的停用词,需要用问号(?)替代停用词。假设a和the是子词典中所定义的停用词,如下:? one ? two : swsw
上述同义词组定义会匹配"a one the two"以及"the one a two",这两个短语均会被swsw替代输出。
- FILEPATH
词典定义文件所在目录。目录可以指定为本地目录和OBS目录两种形式。默认值为预定义词典文件所在目录。其中目录格式、以及使用OBS服务器上的文件创建Synonym字典的过程与Simple词典的FILEPATH相同。
- DICTFILE
- Ispell词典
- DICTFILE
词典定义文件名,默认后缀名为dict。
- AFFFILE
词缀文件名,默认后缀名为affix。
- STOPWORDS
停用词文件名,默认后缀名为stop,文件格式要求与Simple类型词典的停用词文件相同。
- FILEPATH
词典文件所在目录。可以指定为本地目录和OBS目录两种形式。默认值为预定义词典文件所在目录。其中目录格式、以及使用OBS服务器上的文件创建Synonym字典的过程与Simple词典的FILEPATH相同。
- DICTFILE
- Snowball词典
- LANGUAGE
语言名,标识使用哪种语言的词干分析算法。算法按照对应语言中的拼写规则,缩减输入词的常见变体形式为一个基础词或词干。
- STOPWORDS
停用词表文件名,默认后缀名为stop,文件格式要求与Simple类型词典的停用词文件相同。
- FILEPATH
词典定义文件所在目录。可以指定为本地目录或者OBS目录。默认值为预定义词典文件所在目录。FILEPATH参数必须和STOPWORDS参数同时指定,不允许单独指定。其中目录格式、以及用OBS服务器上的文件创建Snowball字典的过程与Simple字典相同。
- LANGUAGE
- 预定义词典文件位于$GAUSSHOME/share/postgresql/tsearch_data目录下。
- 词典定义文件的文件名仅支持小写字母、数字、下划线混合。
- Simple词典对应的option
- value
参数值。如果不是简单的标识符或数字,则参数值必须加单引号(标识符和数字同样可以加上单引号)。
示例
创建一个Ispell词典english_ispell(词典定义文件来自开源词典):
认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
1 2 3 4 5 6 7 8 |
DROP TEXT SEARCH DICTIONARY IF EXISTS english_ispell; CREATE TEXT SEARCH DICTIONARY english_ispell ( TEMPLATE = ispell, DictFile = english, AffFile = english, StopWords = english, FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); |
创建一个Snowball词典english_snowball(词典定义文件来自开源词典):
认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
1 2 3 4 5 6 7 |
DROP TEXT SEARCH DICTIONARY IF EXISTS english_snowball; CREATE TEXT SEARCH DICTIONARY english_snowball ( TEMPLATE = snowball, Language = english, StopWords = english, FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); |