Lanzamiento de pg_tre 1.1.1 — un AM de índice approximate-REGEX para PostgreSQL 18+
Me complace anunciar la primera versión pública de pg_tre, un método de acceso a índices nativo para PostgreSQL 18+ destinado a la coincidencia aproximada mediante expresiones regulares.
El sistema pg_tre indexa columnas de texto mediante un proceso de filtrado en tres niveles (rango tipo BRIN, sparsemap de postings de trigramas y filtro Bloom por tupla), apoyándose en la biblioteca TRE desarrollada por Ville Laurikari para la verificación final en el heap. El resultado es una implementación de coincidencia de expresiones regulares basada en la distancia de Levenshtein (“localizar texto dentro de k ediciones del patrón”), construida sobre un auténtico IndexAmRoutine, con soporte para WAL, reconocimiento de VACUUM y compatibilidad con REINDEX CONCURRENTLY.
Aspectos destacados
- Se ha registrado una implementación de Custom IndexAmRoutine bajo la modalidad USING TRE, incorporando un resource manager personalizado (identificador 140) y una cobertura integral de recuperación ante fallos y replicación en streaming, debidamente validada mediante pruebas TAP.
- Las expresiones regulares con distancia de edición permiten asignar presupuestos por subexpresión. Por ejemplo, body %~~ tre_pattern(‘(error){~1}.*(42[0-9]){~0}’, 1) se ejecuta como un único escaneo de heap mediante bitmap indexado.
- Los trigramas basados en puntos de código UTF-8 garantizan la correcta indexación de caracteres CJK, caracteres acentuados y emojis, sin incurrir en sobrecoste para el conjunto ASCII.
- Se implementa protección frente a ataques de denegación de servicio (DoS) mediante la configuración de límites sobre los estados del autómata finito no determinista (NFA), el tiempo de compilación y el tiempo de ejecución por coincidencia.
- Un esquema de filtrado en tres niveles reduce de manera considerable las operaciones de E/S sobre el heap: las consultas que devuelven un número reducido de registros dentro de conjuntos de millones suelen completarse en tiempos inferiores al milisegundo.
- Se preservan las funciones definidas por el usuario (UDF) tre_amatch* con compatibilidad con versiones anteriores desde la 0.1.0.
Cómo pg_tre se integra en el ecosistema existente
PostgreSQL ya dispone de capacidades sólidas para la búsqueda de texto. pg_tre ha sido concebido para complementarlas, y no para reemplazarlas.
- pg_trgm (GIN/GiST): habilita la aceleración de consultas mediante expresiones regulares exactas, operadores LIKE y medidas de similitud basadas en trigramas. Se trata de una extensión ampliamente validada en entornos de producción. El operador % de pg_trgm implementa una similitud de Jaccard sobre conjuntos de trigramas, la cual no debe confundirse con la distancia de edición: dos cadenas pueden presentar una alta similitud basada en trigramas aun cuando su distancia de Levenshtein sea considerable. Esta extensión es apropiada cuando se requiere aceleración de coincidencias exactas por subcadena o LIKE..
- tsvector / tsquery (motor de búsqueda de texto completo integrado): proporciona capacidades de búsqueda lingüística a nivel de término, incluyendo stemming, eliminación de palabras vacías, ranking y configuración por idioma. Su uso es recomendable para procesamiento de lenguaje natural. Por su parte, pg_trgm es independiente del idioma, lo que lo hace adecuado para identificadores, SKUs, códigos de error y registros de logs, pero no para entender variaciones semánticas como “running” y “run”.
- pgvector / pgvectorscale: proporcionan similitud semántica basada en embeddings (representaciones vectoriales) de valores de punto flotante. Este enfoque es ortogonal a pg_tre, en el sentido de que distingue entre significado y estructura léxica. Ambos pueden componerse de manera natural en un modelo híbrido, utilizando un prefiltrado léxico con pg_tre y un ordenamiento semántico con pgvector.
- pg_tre: implementa expresiones regulares aproximadas con presupuestos explícitos de edición y la semántica completa de las expresiones regulares (clases de caracteres, alternancia, anclajes y repeticiones {m,n}), y es componible con el operador de edición {~k}. Ninguna otra extensión de PostgreSQL, ya sea interna o externa al árbol de contribuciones, permite responder mediante un índice a la pregunta: “¿este texto se encuentra dentro de N ediciones de esta expresión regular?”.
Algunas cosas que solo pg_tre hace bien
- Búsqueda tolerante a errores tipográficos en registros de logs y trazas: body %~~ tre_pattern(‘(timeout){~1}.*(connection){~1}’, 1) permite localizar coincidencias como “timeoutt” y “conection” dentro de una misma consulta.
- Búsqueda de catálogos y códigos SKU con tolerancia a variaciones de edición: sku %~~ tre_pattern(‘AB-9?[0-9]{4}’, 1) permite detectar dígitos omitidos o caracteres transpuestos sin requerir un filtrado posterior costoso.
- Presupuestos de edición por expresión en una única consulta al índice: body %~~ tre_pattern(‘(postgres){~2}.*(system){~0}’, 0) permite representar coincidencias aproximadas de “postgres” manteniendo una coincidencia estricta para “system”, todo ello en un único intercambio con la base de datos y sin requerir procesos de reranking a nivel de aplicación.
- Recuperación híbrida para canalizaciones de agentes y arquitecturas RAG: pg_tre constituye el componente de búsqueda léxico-difusa que pg_trgm, FTS y pgvector no pueden abarcar de manera independiente. Ya se trate de un identificador generado por un LLM con errores tipográficos, de un fallo de OCR en documentos digitalizados o de códigos de error casi duplicados, pg_tre permite detectarlos sin renunciar a la expresividad propia de las expresiones regulares.
Instalación
-- Requires shared_preload_libraries = 'pg_tre' CREATE EXTENSION pg_tre; CREATE INDEX docs_body_tre ON docs USING tre (body); SELECT id FROM docs WHERE body %~~ tre_pattern('database', 1);
Una nota sobre estabilidad y feedback
pg_tre es un software de reciente creación. El formato de almacenamiento en disco se considera estable desde la versión 1.0.0 (la serie 1.1.x mantiene compatibilidad binaria con la versión 1.0.0), la superficie SQL se encuentra definida, los registros WAL poseen control de versiones y la suite de pruebas abarca los procesos de almacenamiento, consulta, recuperación y replicación. No obstante, debido a la juventud del proyecto, es muy probable que aún existan errores que las pruebas actuales no hayan conseguido revelar. No se trata de una versión beta ni de un prototipo experimental; es software plenamente funcional publicado de forma anticipada y debe emplearse con las precauciones correspondientes.
Se agradecen mucho los reportes de errores, solicitudes de funcionalidades y pull requests. En caso de ser posible, se recomienda adjuntar un caso reproducible (un esquema mínimo y una consulta que presente un comportamiento incorrecto), ya que constituye la forma más útil de colaboración, aunque cualquier aporte será apreciado.
Enlaces
- Repositorio: https://codeberg.org/gregburd/pg_tre
- Issues: https://codeberg.org/gregburd/pg_tre/issues
- Biblioteca TRE: https://github.com/laurikari/tre

