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([dictionaryregdictionary, ]stringtext) returnstext
如果省略dictionary参数,则会使用与unaccent()函数本身位于同一模式中、名为unaccent的文本搜索词典。
例如:
SELECT unaccent('unaccent', 'Hôtel');
SELECT unaccent('Hôtel');
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。