F.43. unaccent

unaccent是一种文本搜索词典,用于删除词素中的重音符号。这是一个过滤字典,这意味着其输出总是传递到下一个字典(如果有),这与字典的正常行为不同。这允许对重音不敏感的全文搜索处理。

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

F.43.1. Configuration

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. Usage

安装unaccentextensions 会创建一个文本搜索模板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.43.3. Functions

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

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

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

For example:

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