Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Wyszukiwanie wektorowe, kluczowe i hybrydowe
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.
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 standardowymitsvectortypami 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 ilakebase_bm25. Zobacz lakebase_tokenizer, aby uzyskać informacje o obsługiwanych opcjach i konfiguracji.
Udostępnij dane z lakehouse do wyszukiwania
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:
- Przypisz kolumnę osadzeń do kolumny
vector(n)dla wyszukiwania wektorowego. - Wygeneruj kolumnę
tsvectorz tekstu źródłowego do wyszukiwania słów kluczowych.
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łączanie wyszukiwania w usłudze Lakebase
Włącz wyszukiwanie Lakebase w ustawieniach projektu:
- W projekcie Lakebase kliknij pozycję Ustawienia w obszarze nawigacji po lewej stronie.
- 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_textilakebase_tokenizerdo 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;
Łączenie wyników z wyszukiwaniem hybrydowym
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 |