FTS nie obsługuje LIKE
Poprzednio zaakceptowana odpowiedź była nieprawidłowa. Wyszukiwanie pełnotekstowe z indeksami pełnotekstowymi nie dla LIKE
w ogóle, ma swoje własne operatory i nie działa dla dowolnych ciągów. Działa na słowach w oparciu o słowniki i stemming. tak obsługuje dopasowywanie przedrostków dla słów , ale nie z LIKE
operator:
- Pobierz częściowe dopasowanie z kolumny TSVECTOR indeksowanej GIN
Indeksy trygramów dla LIKE
Zainstaluj dodatkowy moduł pg_trgm
który zapewnia klasy operatorów dla indeksów trygramów GIN i GiST do obsługi wszystkich LIKE
i ILIKE
wzory , a nie tylko te zakotwiczone po lewej stronie:
Przykładowy indeks:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
Lub:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
- Różnica między indeksem GiST i GIN
Przykładowe zapytanie:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trygramy? A co z krótszymi ciągami?
Słowa zawierające mniej niż 3 litery w wartościach indeksowanych nadal działa. Instrukcja:
Przy określaniu zestawu trygramów zawartych w łańcuchu uważa się, że każde słowo ma dwie spacje z przedrostkiem i jedną spację.
A wyszukiwać wzorce zawierające mniej niż 3 litery? Instrukcja:
Dla obu LIKE
i wyszukiwania z użyciem wyrażeń regularnych, pamiętaj, że wzorzec bez możliwych do wyodrębnienia trygramów zdegeneruje się do pełnego skanu indeksu.
Oznacza to, że skanowanie indeksu / indeksu mapy bitowej nadal działa (plany zapytań dla przygotowanego zestawienia nie ulegną zerwaniu), po prostu nie zapewni lepszej wydajności. Zazwyczaj nie ma dużej straty, ponieważ ciągi 1- lub 2-literowe są mało selektywne (więcej niż kilka procent dopasowań tabeli bazowej), a obsługa indeksów nie poprawiłaby wydajności na początku, ponieważ pełne skanowanie tabeli jest szybsze.
text_pattern_ops
do dopasowania prefiksu
Tylko zakotwiczone w lewo wzorce (bez wiodącego symbolu wieloznacznego) uzyskujesz optimum z odpowiednią klasą operatora dla indeksu btree:text_pattern_ops
lub varchar_pattern_ops
. Obie wbudowane funkcje standardowego Postgresa, nie są potrzebne żadne dodatkowe moduły. Podobna wydajność, ale znacznie mniejszy indeks.
Przykładowy indeks:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Przykładowe zapytanie:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Lub , jeśli powinieneś uruchamiać swoją bazę danych z 'C' lokalizacja (właściwie nie locale), wtedy wszystko i tak jest sortowane według kolejności bajtów, a zwykły indeks btree z domyślną klasą operatora wykonuje zadanie.
Więcej szczegółów, wyjaśnień, przykładów i linków w tych powiązanych odpowiedziach na dba.SE:
- Dopasowywanie wzorców za pomocą LIKE, SIMILAR TO lub wyrażeń regularnych w PostgreSQL
- Jak wdrażane jest LIKE?
- Szybkie znajdowanie podobnych ciągów za pomocą PostgreSQL