Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN
Budować produkcyjne wyszukiwanie pełnotekstowe z kolumnami tsvector, indeksami GIN i konfigurowalnymi słownikami wyszukiwania tekstowego
Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Poza podciągami: wyszukiwanie uwzględniające słowa
Wyszukiwanie pełnotekstowe (FTS) rozumie słowa: stemming, słowa pomijane i ranking. PostgreSQL ma tę funkcję wbudowaną za pomocą typów tsvector i tsquery.
Tworzenie tsvector
Przeanalizuj dokument:
SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2Tworzenie tsquery
Przeanalizuj zapytanie:
SELECT to_tsquery('english', 'fox & jumping'); -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');Dopasowanie: @@
Sprawdź dokument względem zapytania:
SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery; -- tIndeksowanie na potrzeby FTS
Dodaj kolumnę tsvector i indeks GIN:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);Wykonywanie zapytań
Szybkie wyszukiwanie z filtrowaniem:
SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;Ranking za pomocą ts_rank
ts_rank ocenia wyniki na podstawie częstotliwości i pozycji słów. ts_rank_cd używa gęstości pokrycia (uwzględnia pozycję):
SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;Fragmenty za pomocą ts_headline
Wyświetl dopasowane fragmenty, wyróżniając dopasowane słowa:
SELECT ts_headline('english', body,
websearch_to_tsquery('english', $1),
'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);Wyszukiwanie fraz
Znajdź sąsiadujące słowa:
SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');Ważenie wielu pól
Nadaj tytułowi większą wagę niż treści za pomocą setweight:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
setweight(to_tsvector('english', coalesce(body,'')), 'B')
) STORED;Konfiguracja języka
Konfiguracja english definiuje słowa pomijane, stemming itp. PostgreSQL jest dostarczany z wieloma językami; można przełączać język:
SELECT to_tsvector('turkish', 'Veritabanı performansı');Ograniczenia wbudowanego FTS
To dobre rozwiązanie dla języków podobnych do angielskiego i podstawowego rankingu. W przypadku bardziej zaawansowanych potrzeb (BM25, osadzenia wektorowe, wyszukiwanie fasetowe) warto rozważyć Elasticsearch lub OpenSearch obok Postgresa.
Podsumowanie
FTS w PostgreSQL to dobry wybór domyślny.
- tsvector + tsquery + dopasowywanie za pomocą @@
- Indeks GIN zapewniający szybkość
- websearch_to_tsquery do obsługi danych wprowadzanych przez użytkownika
- ts_rank/ts_headline do tworzenia uporządkowanych i wyróżnionych wyników
Szybki test
Potrzebne jest szybkie filtrowanie artykułów według zapytania pełnotekstowego. Który indeks należy wybrać?
Często zadawane pytania
Czy lekcja „Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN” jest bezpłatna?
Tak — pełny tekst „Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN”?
Budować produkcyjne wyszukiwanie pełnotekstowe z kolumnami tsvector, indeksami GIN i konfigurowalnymi słownikami wyszukiwania tekstowego Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wyszukiwanie trigramowe (pg_trgm) na potrzeby dopasowania przybliżonego
- Wyszukiwanie pełnotekstowe za pomocą tsvector i GIN
- Indeksowanie geoprzestrzenne za pomocą PostGIS
- Wyszukiwanie wektorowe za pomocą pgvector