Búsqueda de texto completo
¿Cómo funciona la búsqueda de texto completo en PostgreSQL?
La búsqueda de texto completo encuentra documentos por palabras en lugar de por subcadenas exactas, mediante tsvector, tsquery y el operador @@. Un índice GIN la hace rápida.
La búsqueda de texto completo integrada de PostgreSQL divide los documentos en tokens, los normaliza en lexemas (por ejemplo, reduciendo las palabras a su raíz) y guarda el resultado como un tsvector. Una consulta de búsqueda es un tsquery, y el operador @@ comprueba si un documento coincide con ella.
Una configuración de búsqueda de texto como english decide cómo se divide el texto en palabras, qué palabras comunes se ignoran y cómo funciona la reducción a la raíz (stemming). Las funciones de ranking como ts_rank ordenan los resultados por relevancia. Para que las búsquedas sean rápidas, indexa la expresión tsvector con GIN y usa en tus consultas la misma configuración que en el índice.
Ejemplo
El ejemplo indexa el texto de los artículos como tsvector y encuentra las filas que contienen tanto search como postgres. Solo coincide el artículo 1.
CREATE TABLE articles (id int PRIMARY KEY, body text NOT NULL);
INSERT INTO articles VALUES
(1, 'Postgres supports full text search with tsvector and tsquery'),
(2, 'Indexes make lookups fast');
CREATE INDEX articles_fts ON articles USING gin (to_tsvector('english', body));
SELECT id
FROM articles
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'search & postgres');SQL simple para PostgreSQL 16 o 17 estándar, sin extensiones. Ejecútalo en una base de datos vacía que puedas descartar.
Fuentes
Documentación oficial de PostgreSQL (en inglés).