F.43. unaccent

F.43.1. 配置
F.43.2. 用法
F.43.3. 函数

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和一个基于前者的字典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. 函数

unaccent()函数从一个给定的字符串中移除重音(附加符号)。基本上,它是unaccent字典的一个包装器,但是它能在普通的文本搜索环境之外使用。

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

如果dictionary参数被省略,则会使用与unaccent()函数处于同一方案中名为unaccent的文本搜索词典。

例如:

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