lakebase_text

L'estensione lakebase_text aggiunge la ricerca full-text BM25 a Lakebase tramite il lakebase_bm25 tipo di indice. È compatibile con gli operatori di query e di tipo standard tsvector di PostgreSQL.

Install

Abilitare prima di tutto Lakebase Search nelle impostazioni del progetto. Installare quindi l'estensione:

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Aggiornare l'estensione e gli indici

Una nuova versione di Lakebase Search può aggiungere funzionalità, correzioni e miglioramenti delle prestazioni. Sebbene Lakebase Search sia rilasciato come parte degli aggiornamenti di Lakebase, non aggiorna tutto automaticamente. In lakebase_text, due cose vengono aggiornate separatamente e portano numeri di versione che non sono collegati tra loro:

  • La versione dell'estensione è la versione degli oggetti SQL che CREATE EXTENSION lakebase_text crea, inclusi i suoi tipi di dati, funzioni, operatori e il metodo di accesso all'indice lakebase_bm25 . Questa versione è riportata da SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'. ALTER EXTENSION lakebase_text UPDATE aggiorna questa versione.
  • Il formato di archiviazione dell'indice è la disposizione su disco di un lakebase_bm25 indice. L'estensione potrebbe introdurre formati di archiviazione degli indici aggiornati in un aggiornamento, sbloccando più funzionalità e offrendo prestazioni migliori. Tutti gli indici di nuova creazione utilizzano automaticamente il formato di archiviazione più recente, mentre gli indici esistenti possono essere aggiornati al nuovo formato dopo REINDEX INDEX CONCURRENTLY che è disponibile un formato di archiviazione più recente.

L'aggiornamento non è urgente. L'estensione è compatibile con oggetti SQL e formati di archiviazione indicizzati delle versioni precedenti, ma rimanere aggiornato ti mantiene sul percorso supportato e con le migliori prestazioni ed evita una migrazione più grande in seguito, quindi aggiorna quando comodo invece di rimandare indefinitamente.

Note

L'ultima versione di estensione disponibile è riportata da SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'.

La ricerca full-text predefinita di PostgreSQL usa indici GIN e ts_rank per l'assegnazione dei punteggi per pertinenza. ts_rank non usa statistiche del corpus globale, quindi i punteggi diminuiscono man mano che aumentano i dati. lakebase_text migliora in questo modo in due modi:

  • La classificazione BM25 rappresenta contemporaneamente la frequenza dei termini, la lunghezza del documento e le statistiche a livello di corpus, producendo punteggi di pertinenza più accurati rispetto a TF-IDF.
  • Top-K pushdown usa Block-Max WAND per restituire solo i risultati più rilevanti dell'indice, senza assegnare punteggi a ogni corrispondenza nel set di risultati.

Avvio rapido

Compilare l'indice dopo l'inserimento lakebase_bm25 dei dati. BM25 calcola le statistiche a livello di corpus in fase di compilazione dell'indice, non in modo incrementale, pertanto l'indice deve essere creato in una tabella popolata.

-- 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;

L'operatore <@> restituisce un punteggio BM25 negativo. L'ordinamento in base al punteggio crescente restituisce prima i risultati più rilevanti.

Note

Una scansione lakebase_bm25 indice può omettere qualsiasi numero di righe il cui <@> valore sia esattamente 0.0. Non affidarti al fatto che le file a distanza zero vengano restituite o al loro ordine. Per valutare ogni riga, imposta lakebase_bm25.enable_scan su off per utilizzare invece una scansione sequenziale.

Popolare da tabelle sincronizzate

Se carichi il testo sorgente dal Catalogo Unity invece di inserirlo direttamente, le tabelle sincronizzate possono generare una tsvector colonna durante la sincronizzazione, pronta da indicizzare lakebase_bm25 non appena la sincronizzazione si completa. Vedi Mappatura personalizzata dei tipi per la ricerca Lakebase.

Mantenere l'indice accurato

Le statistiche BM25 vengono calcolate in fase di compilazione dell'indice e aggiornate da VACUUM. Per la maggior parte dei carichi di lavoro, i punteggi regolari VACUUM mantengono accurati i punteggi. Dopo il caricamento bulk di una grande quantità di nuovi dati, eseguire VACUUM manualmente:

VACUUM documents;

Per mantenere le query e aggiornare le prestazioni, VACUUM è necessario pulire l'indice tempestivamente. Per una tabella dedicata alla ricerca testuale, Databricks consiglia di impostare autovacuum_vacuum_insert_scale_factor in 0 modo che la soglia dell'autovacuum inserita non cresca con la tabella:

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Con il fattore di scala impostato a 0, autovacuum_vacuum_insert_threshold determina il numero fisso di tuple inserite che attiva l'autovuoto. Regola quella soglia in base al carico di lavoro.

Avviso

Le statistiche globali di BM25 non sono versionate MVCC. Se VACUUM aggiorna le statistiche mentre una transazione utilizza uno snapshot MVCC più vecchio, la transazione può calcolare i punteggi utilizzando statistiche più recenti rispetto al snapshot della riga. La visibilità delle righe rimane conforme a MVCC, ma punteggi, classifiche e risultati top-K possono cambiare all'interno di una REPEATABLE READ transazione. Non affidarti a classifiche BM25 stabili e istantanee su un simulacro VACUUM, incluso l'autoaspirazione.

GUC a livello di sessione

Parametro Tipo Default Descrizione
lakebase_bm25.default_limit integer 1000 Numero massimo di risultati restituiti dall'indice.
lakebase_bm25.prefilter boolean false Quando true, valuta le WHERE condizioni prima di calcolare i punteggi BM25. Usare quando i filtri eliminano molte righe e sono economici da valutare.
lakebase_bm25.enable_scan boolean true Impostare su per forzare false un'analisi sequenziale, ignorando l'indice. Utile per i test.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

Le guc hanno la precedenza sui parametri di archiviazione degli indici quando vengono impostati entrambi.

Parametri di archiviazione dell'indice

Impostare queste opzioni in fase di creazione dell'indice o con ALTER INDEX:

Parametro Tipo Default Intervallo Descrizione
k1 real 1.2 Da 1.2 a 2.0 Saturazione della frequenza dei termini. I valori più alti danno più peso ai termini ripetuti.
b real 0.75 Da 0.0 a 1.0 Normalizzazione della lunghezza del documento. 0.0 disabilita la normalizzazione della lunghezza; 1.0 applica la normalizzazione completa.
default_limit integer 1000 Da 1 a 65535 Limite di fallback quando la GUC della sessione non è impostata.
prefilter boolean false N/A Impostazione del prefiltro di fallback quando la GUC della sessione non è impostata.
-- 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);

Informazioni di riferimento sulle API

Tipi

bm25query_tsvector: combina una query tsvector con l'identificatore di indice di destinazione. Usato come operando destro di <@>.

Operatori

Operatore Signature Returns Descrizione
<@> tsvector <@> bm25query_tsvector double precision Restituisce un punteggio BM25 negativo. Ordine crescente per ottenere prima i risultati più rilevanti.

Functions

Function Returns Descrizione
to_bm25query(query tsvector, index regclass) bm25query_tsvector Costruisce un oggetto query BM25 da un tsvector oggetto e dall'identificatore dell'oggetto dell'indice.

Classi di operatore

Class Impostazione predefinita per Descrizione
tsvector_bm25_ops tsvector Esegue tsvector il mapping delle colonne all'operatore per il <@> punteggio BM25. Questa è la classe di operatore predefinita per tsvector con . lakebase_bm25Non è necessario specificarla in modo esplicito.

Passaggi successivi