pgx-bm25 1.0: búsqueda de texto completo con ranking BM25 mediante un índice nativo de PostgreSQL
PGX Inc. ha publicado la versión 1.0 de pgx-bm25, una extensión que incorpora a PostgreSQL la búsqueda de texto completo con ranking basado en Okapi BM25, implementada como un método nativo de acceso a índices. Es compatible con PostgreSQL 17 y 18 y se instala con el nombre bm25_native.
CREATE EXTENSION bm25_native; CREATE INDEX docs_bm25 ON docs USING bm25_native (body); SELECT id, bm25_score(ctid) AS score FROM docs WHERE body @@@ 'quick fox' ORDER BY body &@@ 'quick fox' LIMIT 10;
El operador @@@ selecciona las filas que coinciden con la búsqueda, mientras que &@@ las ordena según su relevancia. La consulta utiliza un recorrido ordenado del índice, por lo que no es necesario un nodo Sort..
Es un índice de PostgreSQL
El índice completo se almacena en las propias páginas de la relación del índice. Por ello, aprovecha directamente las capacidades del núcleo de PostgreSQL, incluido el registro WAL, la recuperación ante fallos y la replicación física. VACUUM también se encarga de su mantenimiento. No requiere un motor de búsqueda externo ni un entorno de ejecución independiente. La extensión está desarrollada en C sobre los encabezados estándar del servidor y se compila mediante PGXS; todo lo necesario para construirla es un compilador de C y pg_config.
El análisis del texto utiliza los diccionarios Snowball incluidos en PostgreSQL y permite configurar el idioma para cada índice. Así, por ejemplo, una búsqueda de negligent puede encontrar también negligence. Las consultas que devuelven los primeros N resultados ordenados por relevancia utilizan block-max WAND, de modo que una búsqueda habitual con LIMIT 10 no necesita calcular la puntuación de todos los documentos que coinciden.
Funcionalidades de consulta
- Índices multicolumna con puntuación BM25F, que permiten definir ponderaciones y normalización de longitud específicas para cada campo. Los valores de
k1,by las ponderaciones pueden cambiarse medianteALTER INDEX ... SET; los nuevos valores se aplican en el siguiente escaneo, sin necesidad de hacer unREINDEX. - Búsqueda de frases exactas y búsqueda por proximidad basada en la distancia entre tokens, tanto ordenada como no ordenada.
- Consultas booleanas (
must,should,must_not), con posibilidad de anidarlas según sea necesario. - Comodines de prefijo (
judg*). - Ponderaciones aplicables en tiempo de consulta a cualquier cláusula.
- Fragmentos de texto resaltados mediante
bm25_snippet(), con escape HTML activado de forma predeterminada.
Las búsquedas sencillas pueden expresarse directamente como una cadena de texto. Para el resto de los casos se utilizan funciones constructoras que generan un árbol de consulta jsonb. De este modo, la entrada proporcionada por el usuario siempre se trata como un valor y nunca como sintaxis de consulta:
CREATE INDEX docs_bm25 ON docs USING bm25_native (title, summary, body) INCLUDE (id) WITH (key_field = 'id'); SELECT id, bm25_score_key(id) AS score FROM docs WHERE title @@@ bm25_boolean( must => ARRAY[ bm25_term('body', 'tort') ], must_not => ARRAY[ bm25_term('body', 'battery') ]) ORDER BY title &@@ bm25_boolean( must => ARRAY[ bm25_term('body', 'tort') ], must_not => ARRAY[ bm25_term('body', 'battery') ]) LIMIT 10;
Licencia
pgx-bm25 se publica bajo la Licencia de PostgreSQL, con los mismos términos de licencia que PostgreSQL. Se trata de un proyecto independiente que no depende de ningún otro producto o servicio ni establece conexiones con ellos. Tampoco existe una edición comercial separada. El repositorio incluye el código fuente, las suites de pruebas de regresión y TAP, los scripts para realizar benchmarks y el registro de diseño, que contiene una guía de arquitectura y un historial de las decisiones de diseño.
Actualizaciones y pruebas
El formato de almacenamiento en disco garantiza la compatibilidad: los cambios que solo agregan información al formato no requieren ejecutar un REINDEX y, cuando un cambio incompatible lo permite, bm25_upgrade() puede actualizar el índice directamente, sin necesidad de crear uno nuevo. La integración continua (CI) compila y ejecuta las pruebas con PostgreSQL 17 y 18, incluyendo configuraciones con assert habilitado, UBSan y AddressSanitizer, así como pruebas TAP que verifican la recuperación ante fallos y la coherencia entre réplicas. PostgreSQL 19 se prueba actualmente con la versión beta disponible, aunque todavía no se considera una versión principal compatible.
Cómo obtenerlo
make sudo make install
Código fuente, documentación y seguimiento de incidencias: https://github.com/pgexperts/pgx-bm25

