支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

F.46. unaccent — 一个删除变音符号的文本搜索词典 #

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

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

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

F.46.1. 配置 #

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)。

F.46.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.46.3. 函数 #

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

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

如果省略 dictionary 参数,则使用与 unaccent() 函数本身位于同一模式下的名为 unaccent 的文本搜索词典。

例如

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

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。