lakebase_text

La lakebase_text extensión agrega la búsqueda de texto completo BM25 a Lakebase a través del tipo de lakebase_bm25 índice. Es compatible con los operadores de consulta y tipo estándar tsvector de PostgreSQL.

Install

En primer lugar, habilite Lakebase Search en la configuración del proyecto. A continuación, instale la extensión:

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Mejora la extensión y los índices

Una nueva versión de Lakebase Search puede añadir funciones, correcciones y mejoras de rendimiento. Aunque Lakebase Search se publica como parte de las actualizaciones de Lakebase, no actualiza todo automáticamente. En lakebase_text, dos cosas se actualizan por separado y llevan números de versión que no están relacionados entre sí:

  • La versión de extensión es la versión de los objetos SQL que CREATE EXTENSION lakebase_text crea, incluyendo sus tipos de datos, funciones, operadores y el lakebase_bm25 método de acceso al índice. Esta versión es reportada por SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'. ALTER EXTENSION lakebase_text UPDATE actualiza esta versión.
  • El formato de almacenamiento de índice es la disposición en disco de un lakebase_bm25 índice. La extensión podría introducir formatos actualizados de almacenamiento de índice en una actualización, desbloqueando más funciones y ofreciendo un mejor rendimiento. Todos los índices recién creados usan automáticamente el último formato de almacenamiento, mientras que los índices existentes pueden actualizarse al nuevo formato después REINDEX INDEX CONCURRENTLY de que haya disponible un formato de almacenamiento más reciente.

La actualización no es urgente. La extensión es compatible con objetos SQL y formatos de almacenamiento de índices de versiones anteriores, pero mantenerse actualizado te mantiene en la ruta soportada y con mejor rendimiento y evita una migración mayor más adelante, así que actualiza cuando te conviene en lugar de posponerlo indefinidamente.

Nota:

La última versión de extensión disponible es reportada por SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'.

La búsqueda de texto completo integrada de PostgreSQL usa índices GIN y ts_rank para la puntuación de relevancia. ts_rank no usa estadísticas globales de corpus, por lo que las puntuaciones se degradan a medida que crecen los datos. lakebase_text mejora esto de dos maneras:

  • La clasificación BM25 tiene en cuenta la frecuencia de términos, la longitud del documento y las estadísticas en todo el corpus simultáneamente, lo que produce puntuaciones de relevancia más precisas que TF-IDF.
  • Top-K aplicación usa Block-Max WAND para devolver solo los resultados más relevantes de K del índice, sin puntuar todas las coincidencias en el conjunto de resultados.

Inicio rápido

Compile el lakebase_bm25 índice después de insertar datos. BM25 calcula estadísticas en todo el corpus en tiempo de compilación del índice, no incrementalmente, por lo que el índice se debe crear en una tabla rellenada.

-- Create a table with a generated tsvector column
CREATE TABLE documents (
  id      SERIAL PRIMARY KEY,
  passage TEXT,
  vector  TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', passage)) STORED
);

-- Insert data before building the BM25 index
INSERT INTO documents (passage) VALUES
  ('Postgres is a powerful open-source relational database.'),
  ('Vector search finds semantically similar results.'),
  ('BM25 ranking improves full-text search relevance scores.');

-- Create the BM25 index on the populated table
CREATE INDEX documents_passage_bm25 ON documents USING lakebase_bm25 (vector);

-- Query: lower score means more relevant
SELECT id, passage,
  vector <@> to_bm25query(to_tsvector('english', 'database'), 'documents_passage_bm25') AS score
FROM documents
ORDER BY score
LIMIT 5;

El <@> operador devuelve una puntuación BM25 negativa. La ordenación por puntuación ascendente devuelve primero los resultados más relevantes.

Nota:

Un lakebase_bm25 escaneo de índice puede omitir cualquier número de filas cuyo <@> valor sea exactamente 0.0. No confíes en que las filas de distancia cero sean devueltas ni en su orden. Para evaluar cada fila, se configura lakebase_bm25.enable_scan para off usar un escaneo secuencial en su lugar.

Poblar desde tablas sincronizadas

Si cargas texto fuente desde el Catálogo de Unity en lugar de insertarlo directamente, las tablas sincronizadas pueden generar una tsvector columna durante la sincronización, lista para indexar en lakebase_bm25 cuanto termine la sincronización. Consulta Mapeado de tipos personalizado para Lakebase Search.

Mantener el índice preciso

Las estadísticas de BM25 se calculan en tiempo de compilación del índice y se actualizan mediante VACUUM. Para la mayoría de las cargas de trabajo, normalmente VACUUM mantiene las puntuaciones precisas. Después de cargar de forma masiva una gran cantidad de datos nuevos, ejecute VACUUM manualmente:

VACUUM documents;

Para mantener la consulta y actualizar el rendimiento, VACUUM debe limpiar el índice rápidamente. Para una tabla dedicada a la búsqueda de texto, Databricks recomienda establecer autovacuum_vacuum_insert_scale_factor para 0 que el umbral de autovacío activado por inserción no crezca con la tabla:

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Con el factor de escala establecido en 0, autovacuum_vacuum_insert_threshold determina el número fijo de tuplas insertadas que activa el autovacío. Ajusta ese umbral según tu carga de trabajo.

Advertencia

Las estadísticas globales de BM25 no están versionadas por MVCC. Si VACUUM actualiza las estadísticas mientras una transacción utiliza una instantánea antigua de MVCC, la transacción puede calcular puntuaciones usando estadísticas más recientes que su instantánea de fila. La visibilidad de la fila sigue siendo compatible con MVCC, pero las puntuaciones, las clasificaciones y los resultados de los primeros K pueden cambiar dentro de una REPEATABLE READ transacción. No confíes en posiciones BM25 estables en instantáneas a lo largo de un simultáneo VACUUM, incluyendo el autovacío.

GUCs de nivel de sesión

Parámetro Tipo Predeterminado Description
lakebase_bm25.default_limit integer 1000 Número máximo de resultados devueltos del índice.
lakebase_bm25.prefilter boolean false Cuando true, evalúa WHERE las condiciones antes de calcular las puntuaciones de BM25. Use cuando los filtros eliminen muchas filas y sean baratos para evaluar.
lakebase_bm25.enable_scan boolean true Establézcalo en false para forzar un examen secuencial y pase el índice. Útil para las pruebas.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

Las GUC tienen prioridad sobre los parámetros de almacenamiento de índices cuando se establecen ambos.

Parámetros de almacenamiento de índices

Establezca estas opciones en el momento de creación del índice o con ALTER INDEX:

Parámetro Tipo Predeterminado Intervalo Description
k1 real 1.2 De 1.2 a 2.0 Saturación de frecuencia de términos. Los valores más altos proporcionan más peso a términos repetidos.
b real 0.75 De 0,0 a 1,0 Normalización de longitud del documento. 0.0 deshabilita la normalización de longitud; 1.0 aplica la normalización completa.
default_limit integer 1000 De 1 a 65535 Límite de reserva cuando no se establece la guC de sesión.
prefilter boolean false N/A Configuración de prefiltro de reserva cuando no se establece la guC de sesión.
-- Set parameters at index creation (use a new name — the Quick start already created documents_passage_bm25)
CREATE INDEX documents_passage_bm25_tuned ON documents USING lakebase_bm25 (vector)
  WITH (default_limit = 20, k1 = 1.5);

-- Update parameters on an existing index
ALTER INDEX documents_passage_bm25_tuned SET (default_limit = 50);

Referencia de las API

Tipos

bm25query_tsvector: combina una consulta tsvector con el identificador de índice de destino. Se usa como operando derecho de <@>.

Operadores

Operador Signature Returns Description
<@> tsvector <@> bm25query_tsvector double precision Devuelve una puntuación BM25 negativa. Ordene ascendentemente para obtener primero los resultados más relevantes.

Functions

Function Returns Description
to_bm25query(query tsvector, index regclass) bm25query_tsvector Construye un objeto de consulta BM25 a partir de y tsvector el identificador de objeto del índice.

Clases de operador

Class Valor predeterminado para Description
tsvector_bm25_ops tsvector Asigna tsvector columnas al operador para la <@> puntuación BM25. Esta es la clase de operador predeterminada para tsvector con lakebase_bm25; no es necesario especificarla explícitamente.

Pasos siguientes