lakebase_text

Rozszerzenie lakebase_text dodaje wyszukiwanie pełnotekstowe BM25 do usługi Lakebase za pomocą typu indeksu lakebase_bm25 . Jest on zgodny ze standardowym tsvector typem i operatorami zapytań bazy danych PostgreSQL.

Install

Najpierw włącz usługę Lakebase Search w ustawieniach projektu. Następnie zainstaluj rozszerzenie:

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Aktualizacja rozszerzenia i indeksów

Nowa wersja Lakebase Search może dodać funkcje, poprawki i poprawę wydajności. Chociaż Lakebase Search jest udostępniany w ramach aktualizacji Lakebase, nie aktualizuje wszystkiego automatycznie. W lakebase_text, dwie rzeczy aktualizują się osobno i mają numery wersji, które nie są ze sobą powiązane:

  • Wersja rozszerzenia to wersja obiektów SQL, która CREATE EXTENSION lakebase_text tworzy, w tym ich typy danych, funkcje, operatory oraz metodę lakebase_bm25 dostępu indeksowego. Ta wersja jest relacjonowana przez SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'. ALTER EXTENSION lakebase_text UPDATE Aktualizuje tę wersję.
  • Format pamięci indeksowej to układ indeksu lakebase_bm25 na dysku. Rozszerzenie może wprowadzić zaktualizowane formaty pamięci indeksowej w aktualizacji, odblokowując więcej funkcji i zapewniając lepszą wydajność. Wszystkie nowo utworzone indeksy automatycznie korzystają z najnowszego formatu pamięci, natomiast istniejące indeksy można zaktualizować do nowego formatu po REINDEX INDEX CONCURRENTLY udostępnieniu nowszego formatu pamięci.

Aktualizacja nie jest pilna. Rozszerzenie jest kompatybilne z obiektami SQL i formatami pamięci rejestracyjnej z starszych wersji, ale pozostawanie aktualnym pozostaje na wspieranej, najlepiej działającej ścieżce i unika większej migracji w przyszłości, więc aktualizuj ją wtedy, gdy jest wygodnie, zamiast odkładać ją w nieskończoność.

Note

Najnowsza dostępna wersja rozszerzenia jest zgłaszana przez SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'.

Wbudowane wyszukiwanie pełnotekstowe postgreSQL używa indeksów GIN i ts_rank oceniania istotności. ts_rank nie używa globalnych statystyk corpus, więc wyniki obniżają wydajność w miarę wzrostu danych. lakebase_text w ten sposób można poprawić na dwa sposoby:

  • Klasyfikacja BM25 odpowiada za częstotliwość terminów, długość dokumentu i statystyki całej korpusu jednocześnie, generując dokładniejsze wyniki istotności niż TF-IDF.
  • Top-K wypychanie używa Block-Max WAND, aby zwrócić tylko K najbardziej odpowiednich wyników z indeksu, bez oceniania każdego dopasowania w zestawie wyników.

Szybki start

Skompiluj lakebase_bm25 indeks po wstawieniu danych. BM25 oblicza dane statystyczne dotyczące całego indeksu w czasie kompilacji indeksu, a nie przyrostowo, dlatego indeks musi zostać utworzony w wypełnionej tabeli.

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

Operator <@> zwraca ujemny wynik BM25. Kolejność według rosnącego wyniku zwraca najpierw najbardziej odpowiednie wyniki.

Note

Skanowanie lakebase_bm25 indeksowe może pominąć dowolną liczbę wierszy, których <@> wartość wynosi dokładnie 0.0. Nie polegaj na zwrotach rzędów zerowych ani na ich kolejności. Aby ocenić każdy wiersz, ustaw lakebase_bm25.enable_scan sekwencyjne off skanowanie zamiast tego.

Wypełnianie z zsynchronizowanych tabel

Jeśli ładujesz tekst źródłowy z Unity Catalog zamiast wstawiać go bezpośrednio, synchronizowane tabele mogą wygenerować kolumnę tsvector podczas synchronizacji, gotową do indeksowania zaraz lakebase_bm25 po zakończeniu synchronizacji. Zobacz Mapowanie niestandardowych typów dla wyszukiwania bazy jeziora.

Zachowaj dokładność indeksu

Statystyki BM25 są obliczane w czasie kompilacji indeksu i aktualizowane przez VACUUMprogram . W przypadku większości obciążeń regularne wyniki VACUUM są dokładne. Po zbiorczym załadowaniu dużej ilości nowych danych uruchom VACUUM ręcznie:

VACUUM documents;

Aby utrzymać wydajność zapytań i aktualizacji, VACUUM należy szybko wyczyścić indeks. Dla tabeli dedykowanej wyszukiwaniu tekstowemu Databricks zaleca ustawienie autovacuum_vacuum_insert_scale_factor tak, 0 aby próg automatycznego próżnienia wyzwalany przez wstawkę nie rósł wraz z tabelą:

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Przy współczynniku skalowania ustawionym na , 0autovacuum_vacuum_insert_threshold określa stałą liczbę wstawionych krotek, które wywołują autopkurzę. Dostosuj ten próg do swojego obciążenia.

Ostrzeżenie

Globalne statystyki BM25 nie są wersjonowane przez MVCC. Jeśli VACUUM aktualizacja statystyk podczas korzystania z starszego snapshotu MVCC jest aktualizowana, transakcja może obliczać wyniki na podstawie statystyk nowszych niż jej migawka wiersza. Widoczność wierszy pozostaje zgodna z MVCC, ale wyniki, rankingi i wyniki z pierwszej klasy mogą się zmieniać w ramach transakcji REPEATABLE READ . Nie polegaj na stabilnych rankingach BM25 w zestawieniu VACUUMz jednoczesnym , w tym autovacuum.

Karty GUCs na poziomie sesji

Parameter Typ Default Description
lakebase_bm25.default_limit liczba całkowita 1000 Maksymalna liczba wyników zwróconych z indeksu.
lakebase_bm25.prefilter boolean false Gdy trueprogram oblicza WHERE warunki przed obliczeniami wyników BM25. Użyj polecenia , gdy filtry eliminują wiele wierszy i są tanie do oceny.
lakebase_bm25.enable_scan boolean true Ustaw wartość , aby false wymusić skanowanie sekwencyjne, pomijając indeks. Przydatne do testowania.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

Interfejsy GUCs mają pierwszeństwo przed parametrami magazynu indeksu po ustawieniu obu tych parametrów.

Parametry magazynu indeksu

Ustaw te opcje w czasie tworzenia indeksu lub za pomocą polecenia ALTER INDEX:

Parameter Typ Default Range Description
k1 real 1.2 Od 1.2 do 2.0 Nasycenie częstości terminu. Wyższe wartości dają większą wagę powtarzającym się terminom.
b real 0.75 Od 0.0 do 1.0 Normalizacja długości dokumentu. 0.0 wyłącza normalizację długości; 1.0 stosuje pełną normalizację.
default_limit liczba całkowita 1000 Od 1 do 65535 Limit rezerwowy, gdy nie ustawiono interfejsu GUC sesji.
prefilter boolean false N/A Ustawienie prefiltru rezerwowego, gdy nie ustawiono interfejsu GUC sesji.
-- 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);

Odniesienie do API

Typy

bm25query_tsvector: łączy zapytanie tsvector z identyfikatorem indeksu docelowego. Używany jako prawy operand .<@>

Operatorów

Operator Signature Zwroty Description
<@> tsvector <@> bm25query_tsvector double precision Zwraca ujemny wynik BM25. Zamów rosnąco, aby najpierw uzyskać najbardziej odpowiednie wyniki.

Functions

Function Zwroty Description
to_bm25query(query tsvector, index regclass) bm25query_tsvector Tworzy obiekt zapytania BM25 z tsvector identyfikatora obiektu i indeksu.

Klasy operatorów

Class Wartość domyślna dla Description
tsvector_bm25_ops tsvector Mapuje tsvector kolumny na <@> operator oceniania BM25. Jest to domyślna klasa operatorów dla tsvector elementu z wartością lakebase_bm25. Nie trzeba jej jawnie określać.

Następne kroki