unaccent 是一个文本搜索词典,用于从词位 (lexemes) 中移除变音符号。它是一个过滤词典,这意味着它的输出总是会传递给下一个词典(如果存在的话),这与普通词典的行为不同。这允许在全文搜索中实现不区分变音符号的处理。
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/ 中。这个规则文件将带变音符号的字符翻译成相同的无变音符号字符,并且还将连字(ligatures)展开成等效的简单字符序列(例如,Æ 翻译成 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');