lakebase_text

Die lakebase_text Erweiterung fügt die BM25-Volltextsuche über den lakebase_bm25 Indextyp zu Lakebase hinzu. Sie ist kompatibel mit den Standardtyp tsvector - und Abfrageoperatoren von PostgreSQL.

Install

Aktivieren Sie zunächst die Lakebase-Suche in Ihren Projekteinstellungen. Installieren Sie dann die Erweiterung:

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Upgrade der Erweiterung und der Indizes

Eine neue Lakebase Search-Version kann Funktionen, Korrekturen und Leistungsverbesserungen hinzufügen. Obwohl Lakebase Search im Rahmen von Lakebase-Updates veröffentlicht wird, wird nicht alles automatisch aktualisiert. In lakebase_text, werden zwei Dinge separat aufgerüstet und tragen Versionsnummern, die nicht zueinander zusammenhängen:

  • Die Erweiterungsversion ist die Version der SQL-Objekte, die CREATE EXTENSION lakebase_text erstellt werden, einschließlich ihrer Datentypen, Funktionen, Operatoren und der lakebase_bm25 Indexzugriffsmethode. Diese Version wird von SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'berichtet. ALTER EXTENSION lakebase_text UPDATE Aktualisiert diese Version.
  • Das Index-Speicherformat ist das Festplattenlayout eines lakebase_bm25 Indexes. Die Erweiterung könnte in einem Update aktualisierte Indexspeicherformate einführen, mehr Funktionen freischalten und eine bessere Leistung liefern. Alle neu erstellten Indizes verwenden automatisch das neueste Speicherformat, während bestehende Indizes auf das neue Format REINDEX INDEX CONCURRENTLY aufgerüstet werden können, nachdem ein neueres Speicherformat verfügbar ist.

Ein Upgrade ist nicht dringend. Die Erweiterung ist kompatibel mit SQL-Objekten und Indexspeicherformaten älterer Versionen, aber aktuell zu bleiben, hält Sie auf dem unterstützten, leistungsfähigsten Weg und vermeidet eine größere Migration später, daher sollten Sie bei Bequemlichkeit upgraden und nicht unbegrenzt verschieben.

Hinweis

Die aktuellste verfügbare Erweiterungsversion wird von SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'berichtet.

Die integrierte Volltextsuche von PostgreSQL verwendet GIN-Indizes und ts_rank für die Relevanzbewertung. ts_rank verwendet keine globalen Korpusstatistiken, sodass die Bewertungen beeinträchtigt werden, wenn daten wachsen. lakebase_text verbessert dies auf zwei Arten:

  • DIE BM25-Rangfolge führt gleichzeitig zu Begriffshäufigkeits-, Dokumentlängen- und korpusweiten Statistiken und erzeugt genauere Relevanzbewertungen als TF-IDF.
  • Top-K Pushdown verwendet Block-Max WAND, um nur die wichtigsten K-Ergebnisse aus dem Index zurückzugeben, ohne jede Übereinstimmung im Resultset zu bewerten.

Schnellstart

Erstellen Sie den Index nach dem lakebase_bm25 Einfügen von Daten. BM25 berechnet korpusweite Statistiken zur Indexerstellungszeit und nicht inkrementell, sodass der Index in einer aufgefüllten Tabelle erstellt werden muss.

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

Der <@> Operator gibt einen negativen BM25-Wert zurück. Die Sortierung nach aufsteigender Bewertung gibt zuerst die relevantesten Ergebnisse zurück.

Hinweis

Ein Index-Scan lakebase_bm25 kann beliebig viele Zeilen weglassen, deren <@> Wert genau 0.0ist. Verlassen Sie sich nicht darauf, dass Null-Distanz-Zeilen zurückgegeben werden oder auf deren Reihenfolge zurückgegeben werden. Um jede Zeile zu evaluieren, setzen lakebase_bm25.enable_scan Sie stattdessen auf off einen sequentiellen Scan.

Aus synchronisierten Tabellen befüllen

Wenn du Quelltext aus Unity Catalog lädst, anstatt ihn direkt einzufügen, können synchronisierte Tabellen während der Synchronisation eine tsvector Spalte generieren, die sofort nach Abschluss der Synchronisation indexiert lakebase_bm25 werden kann. Siehe Benutzerdefinierte Typzuordnung für Lakebase Search.

Den Index genau halten

BM25-Statistiken werden zur Indexbuildzeit berechnet und von VACUUM. Bei den meisten Arbeitslasten werden die Ergebnisse regelmäßig VACUUM genau beibehalten. Führen Sie VACUUM nach dem Massenladen einer großen Menge neuer Daten manuell aus:

VACUUM documents;

Um die Abfrage- und Aktualisierungsleistung aufrechtzuerhalten, VACUUM muss der Index umgehend bereinigt werden. Für eine Tabelle, die der Textsuche gewidmet ist, empfiehlt Databricks, so einzustellen autovacuum_vacuum_insert_scale_factor0 , dass die vom Einfügen ausgelöste Autovakuum-Schwelle nicht mit der Tabelle wächst:

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Mit dem auf gesetzten 0Skalierungsfaktor bestimmt die autovacuum_vacuum_insert_threshold feste Anzahl der eingefügten Tupel, die Autovacuum auslöst. Passe diese Schwelle je nach Arbeitsbelastung an.

Warnung

Die globalen BM25-Statistiken sind nicht MVCC-versioniert. Wenn VACUUM die Statistik aktualisiert wird, während eine Transaktion einen älteren MVCC-Snapshot verwendet, kann die Transaktion Scores mit neueren Statistiken als ihrem Zeilensnapshot berechnen. Die Zeilensichtbarkeit bleibt MVCC-konform, aber Wertungen, Rankings und Top-K-Ergebnisse können sich innerhalb einer REPEATABLE READ Transaktion ändern. Verlassen Sie sich nicht auf snapshot-stabile BM25-Rankings über ein Gleichwert VACUUM, einschließlich Autovacuum.

GUCs auf Sitzungsebene

Parameter Typ Standard Beschreibung
lakebase_bm25.default_limit integer 1000 Maximale Anzahl von Ergebnissen, die aus dem Index zurückgegeben werden.
lakebase_bm25.prefilter boolean false Wenn true, wertet WHERE Bedingungen vor dem Berechnen von BM25-Bewertungen aus. Verwenden Sie diese Funktion, wenn Filter viele Zeilen beseitigen und günstig ausgewertet werden können.
lakebase_bm25.enable_scan boolean true Wird so festgelegt, dass false ein sequenzieller Scan erzwungen wird und der Index umgangen wird. Nützlich für Tests.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

GUCs haben Vorrang vor Indexspeicherparametern, wenn beide festgelegt sind.

Indexspeicherparameter

Legen Sie diese Optionen zur Indexerstellungszeit oder mit ALTER INDEX:

Parameter Typ Standard Bereich Beschreibung
k1 real 1.2 1.2 bis 2.0 Sättigung der Termhäufigkeit. Höhere Werte verleihen wiederholten Ausdrücken mehr Gewicht.
b real 0.75 0.0 bis 1.0 Normalisierung der Dokumentlänge. 0.0 deaktiviert die Längennormalisierung; 1.0 wendet die vollständige Normalisierung an.
default_limit integer 1000 1 bis 65535 Fallbacklimit, wenn die Sitzungs-GUC nicht festgelegt ist.
prefilter boolean false N/A Fallbackvorfiltereinstellung, wenn die Sitzungs-GUC nicht festgelegt ist.
-- 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);

API-Referenz

Typen

bm25query_tsvector: kombiniert eine Abfrage tsvector mit dem Zielindexbezeichner. Wird als der rechte Operand von <@>.

Betriebspersonal

Operator Signature Rückkehr Beschreibung
<@> tsvector <@> bm25query_tsvector double precision Gibt einen negativen BM25-Wert zurück. Ordnen Sie aufsteigend an, um zuerst die relevantesten Ergebnisse zu erhalten.

Functions

Function Rückkehr Beschreibung
to_bm25query(query tsvector, index regclass) bm25query_tsvector Erstellt ein BM25-Abfrageobjekt aus einem tsvector und dem Objektbezeichner des Indexes.

Operatorklassen

Klasse Standard für Beschreibung
tsvector_bm25_ops tsvector Ordnet tsvector spalten dem Operator für die <@> BM25-Bewertung zu. Dies ist die Standardoperatorklasse für tsvector ; lakebase_bm25Sie müssen sie nicht explizit angeben.

Nächste Schritte