F.40. unaccent

unaccent 是一个文本搜索字典,它从词汇中去掉重音符号(变音标志符号)。 这是一个过滤词典,这意味着它的输出总是传递给下一个字典(如果存在的话),而不像常规行为的字典。 这允许对全文搜索进行重音不敏感的处理。

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

F.40.1. 配置

一个 unaccent 字典接受下面的操作:

  • RULES 是包含翻译规则列表的文件的基本名称。 这个文件必须存储在 $SHAREDIR/tsearch_data/文件夹下 ($SHAREDIR 是指 PostgreSQL安装时的数据共享文件)。 它的名字必须以.rules为后缀 (这个后缀无须出现在 RULES参数中)。

规则文件的格式如下:

  • 每一个行代表一个字符对,由带重音符号的字符跟着一个不带重音符号的字符组成。第一个字符将被翻译为第二个字符。例如:

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

一个对大多数欧洲语言都直接有用的更完整的例子,可以在 unaccent.rules中找到,这个文件在 unaccent模块被安装时就被置于$SHAREDIR/tsearch_data/文件夹下。

F.40.2. 用法

在安装 unaccent扩展的时候,会创建一个unaccent文本搜索模版和一个基于这个模版的字典。 这个unaccent字典有一个默认的参数设置RULES='unaccent',这使得标准的unaccent.rules配置可以立即生效。 如果有需要,你也可以改变这个参数,例如,

mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');

或者创建基于unaccent模版的新字典。

你可以试试下面的sql,来测试这个字典,

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.40.3. 函数

unaccent() 函数从一个给定的字符串中去掉重音符号(变音标志符号)。基本上,它是一个unaccent字典的包装,但它可以超出正常文本搜索的上下文使用。

unaccent([`_dictionary_`, ] _string_) returns text

例如,

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