PostgreSQL: búsqueda insensible a acentos (unaccent)

En Humano, las búsquedas globales (navbar, listas DataTables de contactos y clientes, etc.) pasan por la clase App\Support\SearchNormalizer. En PostgreSQL, si está disponible la extensión unaccent, las coincidencias usan lower(unaccent(...)) para alinear mejor consultas sin acentos con texto almacenado con acentos.

1. Comprobar si unaccent está activa

Conéctate a la misma base de datos que usa Laravel (DB_DATABASE) y ejecuta:

SELECT extname FROM pg_extension WHERE extname = 'unaccent';

Si el resultado está vacío, la extensión no está creada en esa base de datos.

2. Activar unaccent en la base de datos

Ejecuta (requiere permisos suficientes, normalmente superusuario o rol con derecho a crear extensiones):

CREATE EXTENSION IF NOT EXISTS unaccent;
  • Esto se guarda en el catálogo de PostgreSQL: permanece tras reiniciar el servidor Postgres o la máquina.
  • Cada base de datos tiene sus propias extensiones: si tienes varias BDs, repite el comando en la que usa la aplicación.
3. Ubuntu / paquetes en el servidor

CREATE EXTENSION no descarga paquetes del sistema operativo; usa los ficheros que ya trae la instalación de PostgreSQL (habitualmente el paquete postgresql-contrib o equivalente según versión).

Si al crear la extensión aparece un error indicando que falta el fichero de control o que la extensión no está disponible, instala contrib en el servidor, por ejemplo:

sudo apt install postgresql-contrib

El nombre exacto del paquete puede incluir la versión mayor de Postgres (p. ej. postgresql-16 en algunas distribuciones).

4. Tras habilitar unaccent

La aplicación cachea en memoria (por conexión) si unaccent está disponible. Después de ejecutar CREATE EXTENSION en producción, conviene reiniciar workers PHP (Forge, Supervisor, Horizon, contenedor, etc.) o el servicio web para que los procesos vuelvan a detectar la extensión sin usar una respuesta cacheada antigua.

5. MySQL y SQLite

No se usa la extensión unaccent de PostgreSQL. SearchNormalizer sigue aplicando normalización del término de búsqueda y condiciones SQL adaptadas al motor (por ejemplo cadena de replace en MySQL).