F.48. unaccent — un diccionario de búsqueda de texto que elimina diacríticos (acentos) #

F.48.1. Configuración
F.48.2. Uso
F.48.3. Funciones

unaccent es un diccionario de búsqueda de texto que elimina acentos (signos diacríticos) de los lexemas. Es un diccionario de filtrado, lo que significa que su salida siempre se pasa al siguiente diccionario (si lo hay), a diferencia del comportamiento normal de los diccionarios. Esto permite el procesamiento insensible a los acentos para la búsqueda de texto completo (full text search).

La implementación actual de unaccent no se puede utilizar como un diccionario de normalización para el diccionario thesaurus.

Este módulo se considera trusted (de confianza), es decir, puede ser instalado por no superusuarios que tengan el privilegio CREATE en la base de datos actual.

F.48.1. Configuración #

Un diccionario unaccent acepta las siguientes opciones:

  • RULES es el nombre base del archivo que contiene la lista de reglas de traducción. Este archivo debe almacenarse en $SHAREDIR/tsearch_data/ (donde $SHAREDIR significa el directorio de datos compartidos de la instalación de PostgreSQL). Su nombre debe terminar en .rules (el cual no debe incluirse en el parámetro RULES).

El archivo de reglas tiene el siguiente formato:

  • Cada línea representa una regla de traducción, que consiste en un carácter con acento seguido de un carácter sin acento. El primero se traduce en el segundo. Por ejemplo,

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

    Los dos caracteres deben estar separados por espacios en blanco, y cualquier espacio en blanco inicial o final en una línea se ignora.

  • Alternativamente, si solo se proporciona un carácter en una línea, las instancias de ese carácter se eliminan; esto es útil en idiomas donde los acentos se representan mediante caracteres separados.

  • En realidad, cada carácter puede ser cualquier cadena que no contenga espacios en blanco, por lo que los diccionarios unaccent podrían usarse para otros tipos de sustituciones de subcadenas además de la eliminación de diacríticos.

  • Algunos caracteres, como los símbolos numéricos, pueden requerir espacios en blanco en su regla de traducción. En este caso es posible utilizar comillas dobles alrededor de los caracteres traducidos. Una comilla doble debe escaparse con una segunda comilla doble al incluir una en el carácter traducido. Por ejemplo:

    ¼      " 1/4"
    ½      " 1/2"
    ¾      " 3/4"
    “       """"
    ”       """"
    

  • Al igual que con otros archivos de configuración de búsqueda de texto de PostgreSQL, el archivo de reglas debe almacenarse en codificación UTF-8. Los datos se traducen automáticamente a la codificación de la base de datos actual al cargarse. Cualquier línea que contenga caracteres no traducibles se ignora silenciosamente, de modo que los archivos de reglas puedan contener reglas que no sean aplicables en la codificación actual.

Un ejemplo más completo, que es directamente útil para la mayoría de los idiomas europeos, se puede encontrar en unaccent.rules, el cual se instala en $SHAREDIR/tsearch_data/ cuando se instala el módulo unaccent. Este archivo de reglas traduce caracteres con acentos a los mismos caracteres sin acentos, y también expande las ligaduras en la serie equivalente de caracteres simples (por ejemplo, Æ a AE).

F.48.2. Uso #

La instalación de la extensión unaccent crea una plantilla de búsqueda de texto unaccent y un diccionario unaccent basado en ella. El diccionario unaccent tiene el parámetro predeterminado establecido en RULES='unaccent', lo que lo hace inmediatamente usable con el archivo estándar unaccent.rules. Si lo deseas, puedes modificar el parámetro, por ejemplo:

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

o crear nuevos diccionarios basados en la plantilla.

Para probar el diccionario, puedes intentar:

mydb=# select ts_lexize('unaccent','Hôtel');
  ts_lexize
-----------
  {Hotel}
(1 row)

Aquí tienes un ejemplo que muestra cómo insertar el diccionario unaccent en una configuración de búsqueda de texto:

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.48.3. Funciones #

La función unaccent() elimina los acentos (signos diacríticos) de una cadena dada. Básicamente, es una envoltura alrededor de los diccionarios de tipo unaccent, pero se puede usar fuera de los contextos normales de búsqueda de texto.

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

Si se omite el argumento dictionary, se utiliza el diccionario de búsqueda de texto llamado unaccent y que aparece en el mismo esquema que la propia función unaccent().

Por ejemplo:

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