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.
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).
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)
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([dictionaryregdictionary, ]stringtext) returnstext
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');