Skip to content

F.48. unaccent — 一个文本搜索词典,用于移除变音符号#

F.48.1. 配置
F.48.2. 用法
F.48.3. 函数

unaccent是一个文本搜索词典,用于从词素中移除重音(变音符号)。它是一个过滤词典,这意味着它的输出始终传递给下一个词典(如果有的话),这与词典的正常行为不同。这允许对全文搜索进行不区分重音的处理。

unaccent的当前实现不能用作thesaurus词典的规范化词典。

此模块被认为是“受信任的”,也就是说,它可以由拥有当前数据库的CREATE权限的非超级用户安装。

F.48.1. 配置#

一个unaccent词典接受以下选项

  • RULES 是包含转换规则列表的文件的基本名称。此文件必须存储在 $SHAREDIR/tsearch_data/ 中(其中 $SHAREDIR 表示 PostgreSQL 安装的共享数据目录)。它的名称必须以 .rules 结尾(不包含在 RULES 参数中)。

规则文件具有以下格式

  • 每行表示一条转换规则,由带重音的字符和不带重音的字符组成。第一个转换为第二个。例如,

    À        A
    Á        A
    Â        A
    Ã        A
    Ä        A
    Å        A
    Æ        AE
    

    这两个字符必须用空格分隔,并且行中任何前导或尾随空格都将被忽略。

  • 或者,如果一行中只给出了一个字符,则删除该字符的实例;这在重音由单独字符表示的语言中很有用。

  • 实际上,每个 字符 可以是任何不包含空格的字符串,因此 unaccent 词典除了用于移除变音符号外,还可以用于其他类型的子字符串替换。

  • 与其他 PostgreSQL 文本搜索配置文件一样,规则文件必须存储为 UTF-8 编码。加载时,数据会自动转换为当前数据库的编码。包含无法转换的字符的任何行都会被静默忽略,以便规则文件可以包含当前编码中不适用的规则。

一个更完整的示例,它直接适用于大多数欧洲语言,可以在unaccent.rules中找到,当安装unaccent模块时,它会被安装在$SHAREDIR/tsearch_data/中。此规则文件将带重音的字符转换为不带重音的相同字符,并且还将连字扩展为等效的一系列简单字符(例如,Æ 扩展为 AE)。

F.48.2. 用法#

安装unaccent扩展会创建一个文本搜索模板unaccent和一个基于该模板的词典unaccentunaccent词典具有默认参数设置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)

F.48.3. 函数#

unaccent()函数从给定的字符串中删除重音符号(变音符号)。从本质上讲,它是一个unaccent类型词典的包装器,但它可以在正常的文本搜索上下文之外使用。

unaccent([dictionary regdictionary, ] string text) returns text

如果省略*dictionary*参数,则使用与unaccent()函数本身出现在同一架构中的名为unaccent的文本搜索词典。

例如

SELECT unaccent('unaccent', 'Hôtel');
SELECT unaccent('Hôtel');