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');