PostgreSQL
Full-text search y búsqueda textual
Búsqueda textual con tsvector, tsquery, diccionarios, ranking e índices GIN para consultas lingüísticas dentro de PostgreSQL.
- Última actualización
- Actualizada
- Nivel
- Aplicación
PostgreSQL
Búsqueda textual con tsvector, tsquery, diccionarios, ranking e índices GIN para consultas lingüísticas dentro de PostgreSQL.
Full-text search transforma texto en lexemes y consulta esos lexemes según una configuración lingüística:
documento → tokenización → normalización → tsvector
consulta → parsing → tsquery
↓
@@No equivale a ILIKE '%texto%', que compara caracteres.
SELECT to_tsvector('spanish', coalesce(name,'') || ' ' || coalesce(description,''))
@@ websearch_to_tsquery('spanish', $1)
FROM products;to_tsvector: documento normalizado.plainto_tsquery: términos simples combinados de forma segura.phraseto_tsquery: conserva intención de frase.websearch_to_tsquery: sintaxis familiar y segura para input de usuario.to_tsquery: sintaxis avanzada; no debe recibir input libre sin validación.ALTER TABLE products
ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('spanish', coalesce(name,'')), 'A') ||
setweight(to_tsvector('spanish', coalesce(description,'')), 'B')
) STORED;
CREATE INDEX products_search_gin_idx
ON products USING gin(search_vector);La misma configuración debe usarse al construir documento y query.
SELECT id, name,
ts_rank_cd(search_vector, q) AS rank
FROM products,
websearch_to_tsquery('spanish', $1) AS q
WHERE search_vector @@ q
ORDER BY rank DESC, id;El ranking de FTS es una señal, no una definición completa de relevancia. Puede combinarse con popularidad, stock, recencia o reglas del negocio.
La configuración controla stemming y stop words. Texto multilingüe puede requerir:
No uses spanish para contenido predominantemente inglés esperando resultados correctos.
to_tsquery('spanish', 'postgres:*') busca lexemes con prefijo. No es substring arbitrario dentro de una palabra.
Para typos y substrings:
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX products_name_trgm_idx
ON products USING gin(name gin_trgm_ops);Puede acelerar ILIKE, similarity y búsquedas parciales según patrón y selectividad.
FTS y trigramas se complementan:
FTS → palabras, stemming, operadores, ranking
trigram → similitud, typo, substringts_headline('spanish', description, q)Genera fragmentos, pero no debe renderizarse como HTML confiable. Escapa salida y limita tamaño.
Para SKU, email o código exacto usa igualdad o prefix search tipada, no FTS. Limita longitud de input y número de términos; queries complejas pueden consumir CPU.
Revisa:
LIMIT y orden.El índice encuentra candidatos; ordenar por ranking todavía puede requerir trabajo.
to_tsquery con input libre.ts_headline sin escape.igualdad exacta → B-tree
prefijo simple → B-tree/operator class según collation
substring o typo → pg_trgm
palabras y relevancia → FTS
facets, distribución o ranking avanzado → motor especializadowebsearch_to_tsquery es adecuado para input?Extensiones de PostgreSQL añade capacidades sin perder control de seguridad, versionado y portabilidad.