unaccent
是一个文本搜索词典,用于从词素中去除变音符号(变音符号)。它是一个过滤词典,这意味着它的输出总是传递给下一个词典(如果有的话),这与词典的正常行为不同。这允许对全文搜索进行不区分变音符号的处理。
当前 unaccent
的实现不能用作 thesaurus
词典的规范化词典。
此模块被认为是 “受信任的”,也就是说,它可以由在当前数据库上具有 CREATE
权限的非超级用户安装。
一个 unaccent
词典接受以下选项
RULES
是包含转换规则列表的文件的基名。此文件必须存储在 $SHAREDIR/tsearch_data/
中(其中 $SHAREDIR
表示 PostgreSQL 安装的共享数据目录)。它的名称必须以 .rules
结尾(不包含在 RULES
参数中)。
规则文件具有以下格式
每一行表示一个转换规则,由带变音符号的字符和不带变音符号的字符组成。第一个被转换为第二个。例如,
À A Á A Â A Ã A Ä A Å A Æ AE
两个字符之间必须用空格隔开,并且行上任何前导或尾随空格都会被忽略。
或者,如果一行中只给出一个字符,则该字符的实例将被删除;这在变音符号用单独的字符表示的语言中很有用。
实际上,每个 “字符” 可以是任何不包含空格的字符串,因此 unaccent
词典可以用于除去除变音符号之外的其他类型的子字符串替换。
某些字符,例如数字符号,可能需要在它们的转换规则中包含空格。在这种情况下,可以使用双引号将转换后的字符括起来。如果要包含双引号,则需要用另一个双引号将其转义。例如
¼ " 1/4" ½ " 1/2" ¾ " 3/4" “ """" ” """"
与其他 PostgreSQL 文本搜索配置文件一样,规则文件必须存储在 UTF-8 编码中。数据在加载时会自动转换为当前数据库的编码。任何包含不可翻译字符的行都会被静默忽略,因此规则文件可以包含在当前编码中不适用的规则。
更完整的示例(直接适用于大多数欧洲语言)可以在 unaccent.rules
中找到,该文件在安装 unaccent
模块时安装在 $SHAREDIR/tsearch_data/
中。此规则文件将带变音符号的字符转换为不带变音符号的相同字符,并且还将连字扩展为等效的简单字符序列(例如,Æ 转换为 AE)。
安装 unaccent
扩展将创建一个文本搜索模板 unaccent
和一个基于它的词典 unaccent
。unaccent
词典具有默认参数设置 RULES='unaccent'
,这使得它可以立即与标准 unaccent.rules
文件一起使用。如果您愿意,您可以更改参数,例如
mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');
或创建基于该模板的新词典。
要测试词典,您可以尝试
mydb=# select ts_lexize('unaccent','Hôtel'); ts_lexize ----------- {Hotel} (1 row)
以下是一个示例,展示了如何将 unaccent
词典插入文本搜索配置中
mydb=# CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french ); mydb=# ALTER TEXT SEARCH CONFIGURATION fr ALTER MAPPING FOR hword, hword_part, word WITH unaccent, french_stem; mydb=# select to_tsvector('fr','Hôtels de la Mer'); to_tsvector ------------------- 'hotel':1 'mer':4 (1 row) mydb=# select to_tsvector('fr','Hôtel de la Mer') @@ to_tsquery('fr','Hotels'); ?column? ---------- t (1 row) mydb=# select ts_headline('fr','Hôtel de la Mer',to_tsquery('fr','Hotels')); ts_headline ------------------------ <b>Hôtel</b> de la Mer (1 row)
unaccent()
函数从给定字符串中删除变音符号(变音符号)。基本上,它是围绕 unaccent
类型词典的包装器,但它可以在正常的文本搜索上下文之外使用。
unaccent([dictionary
regdictionary
, ]string
text
) returnstext
如果省略了 dictionary
参数,则使用与 unaccent()
函数本身位于相同模式中的名为 unaccent
的文本搜索词典。
例如
SELECT unaccent('unaccent', 'Hôtel'); SELECT unaccent('Hôtel');
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。