Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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_textcrea, inclusi i suoi tipi di dati, funzioni, operatori e il metodo di accesso all'indicelakebase_bm25. Questa versione è riportata daSELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'.ALTER EXTENSION lakebase_text UPDATEaggiorna questa versione. -
Il formato di archiviazione dell'indice è la disposizione su disco di un
lakebase_bm25indice. 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 dopoREINDEX INDEX CONCURRENTLYche è 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'.
Perché lakebase_text invece della ricerca full-text gin standard
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.
Ottimizzare la ricerca
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. |