Wyszukiwanie w usłudze Lakebase

Lakebase Search dodaje hybrydowe wyszukiwanie wektorowe i słowa kluczowe do projektów Lakebase. Włącz to w ustawieniach projektu, a następnie zainstaluj potrzebne rozszerzenia: lakebase_vector do wyszukiwania wektorowego, lakebase_text do wyszukiwania słów kluczowych BM25 oraz opcjonalnie lakebase_tokenizer do konfigurowalnej tokenizacji.

Usługa Lakebase Search udostępnia dwie uzupełniające metody wyszukiwania. Użyj ich samodzielnie lub połącz je w celu wyszukiwania hybrydowego:

  • Wyszukiwanie wektorowe (semantyczne) wyszukuje wiersze, których znaczenie jest najbliżej zapytania, nawet jeśli nie mają żadnych wyrazów. Wykonujesz zapytanie za pomocą osadzania (wektor liczbowy generowany przez model), a indeks zwraca najbliższe wektory według odległości. Używaj go do pytań w języku naturalnym, rekomendacji i generowania wspomaganego wyszukiwaniem (RAG). Obsługiwane przez lakebase_vector.
  • Wyszukiwanie słów kluczowych (pełnotekstowych) klasyfikuje wiersze według tego, jak dobrze pasują do dokładnych terminów w zapytaniu przy użyciu oceniania istotności BM25. Służy do nazw, kodów i wyszukiwań dokładnych terminów, w których wyrazy mają znaczenie. Obsługiwane przez lakebase_text.
  • Wyszukiwanie hybrydowe uruchamia zarówno wyszukiwania, jak i łączy wyniki w jedną rankingową listę, dzięki czemu uzyskasz semantycznie podobne i dokładne dopasowania terminów. Użyj go, gdy zapytania łączą intencję z konkretnymi terminami, co jest najczęstszym przypadkiem w rzeczywistych wyszukiwaniach.

Wyszukiwanie słów kluczowych a wyszukiwanie wektorowe dla zapytania „szybki samochód sportowy”. Wyszukiwanie słów kluczowych (lakebase_text) dopasowuje tylko dokumenty zawierające wpisane słowa i pomija synonimy, takie jak „szybki automobil” i „Ferrari 488 supercar”. Wyszukiwanie wektorowe (lakebase_vector) umieszcza zapytanie i dokumenty w tej samej przestrzeni osadzeń i zwraca najbliższych sąsiadów pod względem znaczenia, w tym te synonimy.

Jak to działa

Pod maską Lakebase Search zbudowano na trzech rozszerzeniach Postgres:

  • lakebase_vector dodaje przybliżone wyszukiwanie wektorów najbliższego sąsiada (ANN) za pośrednictwem typu indeksu lakebase_ann . Jest to gotowy do użycia zamiennik dla pgvector: te same typy wektorów, operatory odległości i składnia zapytań działają bez żadnych modyfikacji. Wewnętrznie wykorzystuje partycjonowanie IVF z kwantyzacją RaBitQ, co pozwala obsługiwać indeksy obejmujące ponad 1 miliard wektorów w ramach pojedynczego indeksu i umożliwia ich budowę nawet 50–100 razy szybszą niż w przypadku HNSW. Indeksy są oparte na pamięci trwałej i przetrwają skalowanie do zera bez konieczności rozgrzewania.

  • lakebase_text dodaje wyszukiwanie pełnotekstowe BM25 za pośrednictwem typu indeksu lakebase_bm25 . Jest on zgodny ze standardowymi tsvector typami i operatorami zapytań bazy danych PostgreSQL. Klasyfikacja BM25 oznacza jednocześnie częstotliwość terminów, długość dokumentu i statystyki dotyczące całego korpusu. Top-K pushdown (Block-Max WAND) pobiera tylko wyniki K najbardziej odpowiednie z indeksu zamiast oceniania każdego dopasowania.

  • lakebase_tokenizer dodaje konfigurowalną tokenizację całych słów oraz morfologiczną analizę w języku chińskim, japońskim i koreańskim (CJK) za pośrednictwem interfejsu słownika tekstowego PostgreSQL. Generuje standardowe wartości PostgreSQL tsvector, które współpracują z indeksami GIN i lakebase_bm25. Zobacz lakebase_tokenizer, aby uzyskać informacje o obsługiwanych opcjach i konfiguracji.

Możesz serwować wyszukiwanie na podstawie danych pochodzących z domku nad jeziorem, a nie tylko danych zapisanych bezpośrednio w Postgres. Użyj zsynchronizowanych tabel do synchronizacji tabeli Unity Catalog z Lakebase i przypisuj jej kolumny do typów Postgres gotowych do wyszukiwania podczas synchronizacji:

Po zakończeniu synchronizacji zbuduj indeks lakebase_ann lub lakebase_bm25 dla zsynchronizowanej kolumny i udostępniaj swoim aplikacjom wyszukiwanie o niskich opóźnieniach wraz z danymi operacyjnymi. Konfigurację mapowania można znaleźć w Custom type mapping for Lakebase Search.

Requirements

  • Postgres 16 lub nowszy
  • Włączanie usługi Lakebase Search w projekcie jest nieodwracalne

Włącz wyszukiwanie Lakebase w ustawieniach projektu:

  1. W projekcie Lakebase kliknij pozycję Ustawienia w obszarze nawigacji po lewej stronie.
  2. W obszarze Wyszukiwanie w usłudze Lakebase kliknij pozycję Włącz wyszukiwanie w usłudze Lakebase.

Warning

Włączanie wyszukiwania w usłudze Lakebase:

  • Uruchamia ponownie wszystkie obliczenia w projekcie, porzucając wszystkie aktywne połączenia
  • Udostępnia rozszerzenia lakebase_vector, lakebase_text i lakebase_tokenizer do zainstalowania
  • Nie można wyłączyć po włączeniu

Instalowanie rozszerzeń

Po włączeniu usługi Lakebase Search zainstaluj rozszerzenia w bazie danych:

-- Required: vector search (CASCADE installs pgvector as a dependency)
CREATE EXTENSION IF NOT EXISTS lakebase_vector CASCADE;

-- Required: BM25 full-text search
CREATE EXTENSION IF NOT EXISTS lakebase_text;

-- Optional: configurable tokenization
CREATE SCHEMA IF NOT EXISTS tokenizer_ext;
CREATE EXTENSION IF NOT EXISTS lakebase_tokenizer WITH SCHEMA tokenizer_ext;

Wprowadzenie

Poniższy przykład tworzy tabelę documents z kolumną wektorową i kolumną wyszukiwania pełnotekstowego, a następnie uruchamia zapytania wektorowe i kluczowe:

Note

W tych przykładach użyto małych wektorów literałowych, takich jak '[0.1, 0.2, 0.3]', dla zilustrowania. W rzeczywistej aplikacji generuj osadzanie zewnętrznie przy użyciu modelu osadzania, a następnie zapisz wynik w kolumnie VECTOR . W Databricks możesz odpyt(y)wać model osadzania za pomocą Model Serving, na przykład za pomocą ai_query w notesie lub w Databricks SQL, a następnie wstawić wynikowe wektory do Lakebase. Kolumna VECTOR(n) i indeks muszą używać tego samego wymiaru n co dane wyjściowe modelu (zazwyczaj od 384 do 1536).

-- Create a table with a vector column and a tsvector column
CREATE TABLE documents (
  id        SERIAL PRIMARY KEY,
  title     TEXT NOT NULL,
  body      TEXT NOT NULL,
  embedding VECTOR(3),
  body_tsv  TSVECTOR
);

-- Create a vector search index
CREATE INDEX documents_embedding_idx ON documents
  USING lakebase_ann (embedding vector_cosine_ops);

-- Insert sample data and populate the tsvector column
INSERT INTO documents (title, body, embedding, body_tsv) VALUES
  ('Postgres overview', 'Postgres is an open-source relational database.', '[0.1, 0.2, 0.3]', to_tsvector('english', 'Postgres is an open-source relational database.')),
  ('Vector search guide', 'Vector search finds semantically similar results.', '[0.4, 0.5, 0.6]', to_tsvector('english', 'Vector search finds semantically similar results.')),
  ('Full-text search', 'BM25 ranking improves keyword search relevance.', '[0.7, 0.8, 0.9]', to_tsvector('english', 'BM25 ranking improves keyword search relevance.'));

-- Build the BM25 index after inserting data
-- BM25 computes corpus statistics at build time, not incrementally
CREATE INDEX documents_body_bm25 ON documents USING lakebase_bm25 (body_tsv);

-- Vector similarity search
SELECT id, title
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, 0.3]'
LIMIT 5;

-- BM25 keyword search (lower score = more relevant)
SELECT id, title,
  body_tsv <@> to_bm25query(to_tsvector('english', 'database'), 'documents_body_bm25') AS score
FROM documents
ORDER BY score
LIMIT 5;

Poniższy przykład wyszukiwania hybrydowego ponownie wykorzystuje tabelę documents i indeksy z Wprowadzenie. Pobiera najlepszych kandydatów z każdego wyszukiwania niezależnie od siebie, a następnie łączy ich wyniki w jeden ranking przy użyciu metody Reciprocal Rank Fusion (RRF): wyniki, które zajmują wysokie pozycje w jednym lub obu wyszukiwaniach, uzyskują wyższą pozycję.

WITH vector_ranked AS (
  SELECT id, RANK() OVER (ORDER BY dist) AS rank
  FROM (
    SELECT id, embedding <=> '[0.1, 0.2, 0.3]' AS dist
    FROM documents
    ORDER BY dist
    LIMIT 40
  ) v
),
keyword_ranked AS (
  SELECT id, RANK() OVER (ORDER BY score) AS rank
  FROM (
    SELECT id, body_tsv <@> to_bm25query(to_tsvector('english', 'database'), 'documents_body_bm25') AS score
    FROM documents
    ORDER BY score
    LIMIT 40
  ) k
)
SELECT d.id, d.title,
  COALESCE(1.0 / (60 + v.rank), 0) + COALESCE(1.0 / (60 + k.rank), 0) AS rrf_score
FROM documents d
LEFT JOIN vector_ranked v ON d.id = v.id
LEFT JOIN keyword_ranked k ON d.id = k.id
WHERE v.id IS NOT NULL OR k.id IS NOT NULL
ORDER BY rrf_score DESC, d.id
LIMIT 10;

Każdy CTE pobiera własne 40 najlepszych kandydatów. RANK() przypisuje tę samą rangę do powiązanych wyników. Stała 60 tłumi wpływ wyników o niskiej klasyfikacji i d.id przerywa powiązania dla stabilnej stronicowania. Dostrój parametr LIMIT dla każdej listy oraz stałą RRF dla swoich danych. Inne metody fuzji, takie jak punktacja ważona, są również poprawne.

Extensions

Extension Purpose Typ indeksu
lakebase_vector Wyszukiwanie wektorów ANN, zgodne z pgvector lakebase_ann
lakebase_text Wyszukiwanie pełnotekstowe BM25, zgodne z FTS lakebase_bm25
lakebase_tokenizer Konfigurowalna tokenizacja Nie dotyczy