FTS nie obsługuje LIKE
Uprzednio zaakceptowane odpowiedź była błędna. Wyszukiwanie pełnotekstowe z indeksami pełnotekstowymi nie jest w ogóle dla LIKE
operatora, ma własne operatory i nie działa dla dowolnych ciągów znaków. Opiera się na słowach opartych na słownikach i podstawach. To robi support dopasowanie prefiksu dla słów , ale nie z LIKE
operatorem:
Indeksy Trigram dla LIKE
Zainstaluj dodatkowy moduł, pg_trgm
który zapewnia klasy operatorów dla indeksów trygramowych GIN i GiST do obsługi wszystkich wzorców LIKE
iILIKE
, a nie tylko zakotwiczonych w lewo:
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);
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 strunami?
Słowa z mniej niż 3 literami w indeksowanych wartościach nadal działają. Instrukcja:
Uważa się, że każde słowo ma dwie spacje z przedrostkiem i jedną spację z sufiksem podczas określania zestawu trygramów zawartych w ciągu.
A wzorce wyszukiwania zawierające mniej niż 3 litery? Instrukcja:
W przypadku wyszukiwania zarówno przy LIKE
użyciu wyrażeń regularnych, jak i przy wyszukiwaniu z użyciem wyrażeń regularnych należy pamiętać, że wzorzec bez trygramów, które można wyodrębnić, zdegeneruje się do pełnego skanowania indeksu.
Oznacza to, że skanowanie indeksów indeksów / bitmap nadal działa (plany zapytań dla przygotowanej instrukcji nie zepsują się), po prostu nie da ci to lepszej wydajności. Zwykle nie ma dużej straty, ponieważ 1- lub 2-literowe łańcuchy nie są selektywne (więcej niż kilka procent dopasowań w tabeli bazowej), a obsługa indeksu nie poprawiłaby wydajności na początku, ponieważ pełne skanowanie tabeli jest szybsze.
text_pattern_ops
do dopasowywania prefiksów
W przypadku wzorców zakotwiczonych w lewo (bez wiodących symboli wieloznacznych) uzyskuje się optimum z odpowiednią klasą operatora dla indeksu btree: text_pattern_ops
lubvarchar_pattern_ops
. Obie wbudowane funkcje standardowego Postgres, 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ś uruchomić swoją bazę danych z ustawieniem regionalnym `` C '' (efektywnie nie ustawień regionalnych), to wszystko i tak jest sortowane według kolejności bajtów, a zwykły indeks btree z domyślną klasą operatora załatwia sprawę.
Więcej szczegółów, wyjaśnienia, przykłady i linki w tych powiązanych odpowiedziach na dba.SE: