lakebase_text

De lakebase_text extensie voegt BM25 zoeken in volledige tekst toe aan Lakebase via het lakebase_bm25 indextype. Het is compatibel met het standaardtype tsvector en queryoperators van PostgreSQL.

Install

Schakel eerst Lakebase Search in uw projectinstellingen in. Installeer vervolgens de extensie:

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Upgrade de extensie en indexen

Een nieuwe Lakebase Search-release kan functies, fixes en prestatieverbeteringen toevoegen. Hoewel Lakebase Search wordt uitgebracht als onderdeel van Lakebase-updates, wordt niet alles automatisch bijgewerkt. In lakebase_text, upgraden twee dingen afzonderlijk en dragen versienummers die niet aan elkaar gerelateerd zijn:

  • De extensieversie is de versie van de SQL-objecten die CREATE EXTENSION lakebase_text aanmaakt, inclusief de datatypes, functies, operatoren en de lakebase_bm25 indextoegangsmethode. Deze versie wordt gerapporteerd door SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'. ALTER EXTENSION lakebase_text UPDATE Updates van deze versie.
  • Het indexopslagformaat is de op-schijf indeling van een lakebase_bm25 index. De uitbreiding kan in een update bijgewerkte indexopslagformaten introduceren, waardoor meer functies worden ontgrendeld en betere prestaties worden geleverd. Alle nieuw aangemaakte indexen gebruiken automatisch het nieuwste opslagformaat, terwijl bestaande indexen kunnen worden geüpgraded naar het nieuwe formaat nadat REINDEX INDEX CONCURRENTLY een nieuwer opslagformaat beschikbaar is.

Upgraden is niet dringend. De extensie is compatibel met SQL-objecten en indexopslagformaten van oudere versies, maar het up-to-date blijven houd je op het ondersteunde, best presterende pad en voorkomt een grotere migratie later, dus upgrade wanneer het uitkomt in plaats van het eindeloos uit te stellen.

Note

De laatst beschikbare extensieversie wordt gerapporteerd door SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'.

De ingebouwde zoekfunctie voor volledige tekst van PostgreSQL maakt gebruik van GIN-indexen en ts_rank voor relevantiescores. ts_rank maakt geen gebruik van globale verzamelingsstatistieken, dus scores verslechteren naarmate gegevens groeien. lakebase_text verbetert dit op twee manieren:

  • BM25-classificatieaccounts voor termfrequentie, documentlengte en corpusbrede statistieken tegelijkertijd, waardoor nauwkeurigere relevantiescores worden geproduceerd dan TF-IDF.
  • Top-K pushdown maakt gebruik van Block-Max WAND om alleen de K meest relevante resultaten van de index te retourneren, zonder elke overeenkomst in de resultatenset te scoren.

Snel starten

Bouw de lakebase_bm25 index na het invoegen van gegevens. BM25 berekent statistieken voor de gehele index tijdens het bouwen van indexen, niet incrementeel, dus moet de index worden gemaakt op een gevulde tabel.

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

De <@> operator retourneert een negatieve BM25-score. Rangschikken op oplopende score retourneert eerst de meest relevante resultaten.

Note

Een lakebase_bm25 indexscan kan elk aantal rijen weglaten waarvan de <@> waarde precies 0.0is. Vertrouw niet op het teruggeven van rijen met nul afstand of op hun volgorde. Om elke rij te evalueren, zet lakebase_bm25.enable_scan je in op off een sequentiële scan.

Vul uit gesynchroniseerde tabellen

Als je brontekst uit Unity Catalog laadt in plaats van het direct in te voegen, kunnen gesynchroniseerde tabellen tijdens de synchronisatie een tsvector kolom genereren, klaar om te indexeren lakebase_bm25 zodra de synchronisatie voltooid is. Zie Aangepaste type-mapping voor Lakebase Search.

De index nauwkeurig houden

BM25-statistieken worden berekend bij de buildtijd van de index en bijgewerkt door VACUUM. Voor de meeste workloads blijven de scores regelmatig VACUUM nauwkeurig. Nadat u een grote hoeveelheid nieuwe gegevens bulksgewijs hebt geladen, voert u het volgende handmatig uit VACUUM :

VACUUM documents;

Om de query- en updateprestaties te behouden, VACUUM moet de index snel schoon worden. Voor een tabel die gewijd is aan tekstzoekopdrachten te bestemd autovacuum_vacuum_insert_scale_factor is 0 dat de door inserts getriggerde autovacuümdrempel niet meegroeit met de tabel:

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Met de schaalfactor ingesteld op 0, autovacuum_vacuum_insert_threshold bepaalt het vaste aantal ingevoegde tuples dat autovacuum activeert. Stel die drempel af op basis van je werkdruk.

Waarschuwing

De globale statistieken van BM25 zijn niet MVCC-versiegevat. Als VACUUM de statistieken worden bijgewerkt terwijl een transactie een oudere MVCC-snapshot gebruikt, kan de transactie scores berekenen met statistieken die nieuwer zijn dan de rijsnapshot. De zichtbaarheid van de rij blijft MVCC-conform, maar scores, ranglijsten en top-K-resultaten kunnen binnen een REPEATABLE READ transactie veranderen. Vertrouw niet op snapshot-stabiele BM25-ranglijsten over een gelijktijdig VACUUM, inclusief autovacuum.

GPC's op sessieniveau

Parameter Typ Verstek Beschrijving
lakebase_bm25.default_limit integer 1000 Maximum aantal resultaten dat wordt geretourneerd door de index.
lakebase_bm25.prefilter boolean false Wanneer true, evalueert WHERE voorwaarden voor het berekenen van BM25-scores. Gebruik deze functie wanneer filters veel rijen elimineren en goedkoop zijn om te evalueren.
lakebase_bm25.enable_scan boolean true Ingesteld op false het afdwingen van een sequentiële scan, waarbij de index wordt overgeslagen. Handig voor testen.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

GUC's hebben voorrang op indexopslagparameters wanneer beide zijn ingesteld.

Indexopslagparameters

Stel deze opties in tijdens het maken van de index of met ALTER INDEX:

Parameter Typ Verstek Bereik Beschrijving
k1 real 1.2 1.2 tot 2.0 Verzadiging van termfrequentie Hogere waarden geven meer gewicht aan herhaalde termen.
b real 0.75 0.0 tot 1.0 Normalisatie van documentlengte. 0.0 schakelt lengtenormalisatie uit; 1.0 past volledige normalisatie toe.
default_limit integer 1000 1 tot 65535 Terugvallimiet wanneer de sessie-GUC niet is ingesteld.
prefilter boolean false N/A Instelling voor terugvalvoorfilter wanneer de sessie-GUC niet is ingesteld.
-- 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-referentie

Typen

bm25query_tsvector: combineert een query tsvector met de doelindex-id. Wordt gebruikt als de rechteroperand van <@>.

Bedieners

Operator Signature Returns Beschrijving
<@> tsvector <@> bm25query_tsvector double precision Retourneert een negatieve BM25-score. Volgorde oplopend om eerst de meest relevante resultaten te krijgen.

Functions

Function Returns Beschrijving
to_bm25query(query tsvector, index regclass) bm25query_tsvector Hiermee wordt een BM25-queryobject samengesteld op basis van een tsvector en de object-id van de index.

Operatorklassen

Class Standaard voor Beschrijving
tsvector_bm25_ops tsvector Hiermee worden tsvector kolommen toegewezen aan de <@> operator voor BM25-score. Dit is de standaardoperatorklasse voor tsvector ; lakebase_bm25u hoeft deze niet expliciet op te geven.

Volgende stappen