lakebase_text

Tillägget lakebase_text lägger till BM25 fulltextsökning till Lakebase via lakebase_bm25 indextypen. Den är kompatibel med PostgreSQL:s standardtyp tsvector - och frågeoperatorer.

Install

Aktivera Först Lakebase Search i dina projektinställningar. Installera sedan tillägget:

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Uppgradera tillägget och indexen

En ny Lakebase Search-version kan lägga till funktioner, fixar och prestandaförbättringar. Även om Lakebase Search släpps som en del av Lakebase-uppdateringarna, uppgraderar det inte allt automatiskt. I lakebase_text, uppgraderas två saker separat och bär versionsnummer som inte är relaterade till varandra:

  • Tilläggsversionen är den version av SQL-objekten som CREATE EXTENSION lakebase_text skapar, inklusive dess datatyper, funktioner, operatorer och lakebase_bm25 indexåtkomstmetoden. Denna version rapporteras av SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'. ALTER EXTENSION lakebase_text UPDATE uppdaterar denna version.
  • Indexlagringsformatet är den diskbaserade layouten av ett lakebase_bm25 index. Tillägget kan introducera uppdaterade indexlagringsformat i en uppdatering, låsa upp fler funktioner och leverera bättre prestanda. Alla nyskapade index använder automatiskt det senaste lagringsformatet, medan befintliga index kan uppgraderas till det nya formatet REINDEX INDEX CONCURRENTLY efter att ett nyare lagringsformat blivit tillgängligt.

Uppgradering är inte brådskande. Tillägget är kompatibelt med SQL-objekt och indexlagringsformat från äldre versioner, men att hålla sig uppdaterad håller dig på den stödda, bäst presterande vägen och undviker en större migrering senare, så uppgradera när det är bekvämt istället för att skjuta upp det på obestämd tid.

Note

Den senaste tillgängliga tilläggsversionen rapporteras av SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'.

PostgreSQL:s inbyggda fulltextsökning använder GIN-index och ts_rank för relevansbedömning. ts_rank använder inte global corpus-statistik, så poängen försämras när data växer. lakebase_text förbättrar detta på två sätt:

  • BM25-rankningskonton för termfrekvens, dokumentlängd och corpus-wide-statistik samtidigt, vilket ger mer exakta relevanspoäng än TF-IDF.
  • Top-K pushdown använder Block-Max WAND för att endast returnera de K mest relevanta resultaten från indexet, utan att bedöma varje matchning i resultatuppsättningen.

Snabbstart

Skapa indexet lakebase_bm25 när du har infogat data. BM25 beräknar corpus-wide-statistik vid indexet byggtid, inte inkrementellt, så indexet måste skapas i en ifylld tabell.

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

Operatorn <@> returnerar en negativ BM25-poäng. När du beställer efter stigande poäng returneras de mest relevanta resultaten först.

Note

En lakebase_bm25 indexskanning kan utelämna valfritt antal rader vars <@> värde är exakt 0.0. Förlita dig inte på att noll-avståndsrader returneras eller på deras ordning. För att utvärdera varje rad, sätt lakebase_bm25.enable_scan istället att off använda en sekventiell skanning.

Befolka från synkade tabeller

Om du laddar källtext från Unity Catalog istället för att infoga den direkt, kan synkade tabeller generera en tsvector kolumn under synkroniseringen, redo att indexeras med lakebase_bm25 så snart synkroniseringen är klar. Se Anpassad typmappning för Lakebase Search.

Håll indexet korrekt

BM25-statistik beräknas vid indexet byggtid och uppdateras av VACUUM. För de flesta arbetsbelastningar håller regelbundna VACUUM poäng korrekta. När du har massinläsning av en stor mängd nya data kör du VACUUM manuellt:

VACUUM documents;

För att bibehålla fråge- och uppdateringsprestanda VACUUM måste indexet rensas snabbt. För en tabell dedikerad till textsökning rekommenderar Databricks att man ställer in autovacuum_vacuum_insert_scale_factor så att 0 den insättningsutlösta autovakuumtröskeln inte växer med tabellen:

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Med skalfaktorn satt till 0, autovacuum_vacuum_insert_threshold bestämmer det fasta antalet insatta tupler som utlöser autovakuum. Justera den tröskeln baserat på din arbetsbelastning.

Varning

BM25:s globala statistik är inte MVCC-versionad. Om VACUUM statistiken uppdateras medan en transaktion använder en äldre MVCC-snapshot kan transaktionen beräkna poäng med statistik som är nyare än dess radsnapshot. Radsynlighet är fortfarande MVCC-kompatibel, men poäng, rankningar och topp-K-resultat kan ändras inom en REPEATABLE READ transaktion. Lita inte på snapshot-stabila BM25-rankningar över en samtidig VACUUM, inklusive autovacuum.

Sessionsnivå-GUC:er

Parameter Type Förinställning Description
lakebase_bm25.default_limit integer 1000 Maximalt antal resultat som returneras från indexet.
lakebase_bm25.prefilter boolean false När trueutvärderar villkor innan BM25-poäng beräknas WHERE . Använd när filter eliminerar många rader och är billiga att utvärdera.
lakebase_bm25.enable_scan boolean true Ange till för false att framtvinga en sekventiell genomsökning genom att kringgå indexet. Användbart för testning.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

GUC:er har företräde framför indexlagringsparametrar när båda anges.

Indexlagringsparametrar

Ange dessa alternativ när indexet skapas eller med ALTER INDEX:

Parameter Type Förinställning Räckvidd Description
k1 real 1.2 1.2 till 2.0 Termfrekvensmättnad. Högre värden ger större vikt åt upprepade termer.
b real 0.75 0,0 till 1,0 Normalisering av dokumentlängd. 0.0 inaktiverar längdnormalisering. 1.0 tillämpar fullständig normalisering.
default_limit integer 1000 1 till 65535 Återställningsgräns när sessionens GUC inte har angetts.
prefilter boolean false N/A Inställning för reservförfilter när sessionens GUC inte har angetts.
-- 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-referens

Typer

bm25query_tsvector: kombinerar en fråga tsvector med målindexidentifieraren. Används som rätt operand i <@>.

Operatörer

Operator Signature Returns Description
<@> tsvector <@> bm25query_tsvector double precision Returnerar en negativ BM25-poäng. Beställ stigande för att få de mest relevanta resultaten först.

Functions

Function Returns Description
to_bm25query(query tsvector, index regclass) bm25query_tsvector Konstruerar ett BM25-frågeobjekt från en tsvector och indexets objektidentifierare.

Operatorklasser

Class Standard för Description
tsvector_bm25_ops tsvector Mappar tsvector kolumner till operatorn <@> för BM25-bedömning. Det här är standardoperatorklassen för tsvector med lakebase_bm25. Du behöver inte uttryckligen ange den.

Nästa steg