↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本。 PostgreSQL 11 已结束支持。 2023-11-09. 请参阅 当前版本手册.

F.43. unaccent #

unaccent 是一个文本检索词典,它会从词位中移除重音符号(变音符号)。它是一个过滤词典,也就是说,它的输出总会被传递给下一个词典(如果有),这不同于词典的通常行为。这使得全文检索能够以不区分重音的方式处理文本。

unaccent 当前的实现还不能作为 thesaurus 词典的正规化词典使用。

F.43.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.43.2. 用法

安装 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)

F.43.3. 函数

unaccent() 函数会从给定字符串中移除重音符号(变音符号)。从本质上说,它是对 unaccent 这一类型词典的一个包装器,但也可以在常规文本检索环境之外使用。

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

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

例如:

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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.