Nie używasz klasy operatora dostarczonej przez pg_trgm
moduł. Utworzyłbym indeks taki:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Pierwotnie miałem tutaj indeks GIN, ale później dowiedziałem się, że GiST prawdopodobnie jeszcze lepiej nadaje się do tego rodzaju zapytań, ponieważ może zwracać wartości posortowane według podobieństwa. Więcej szczegółów:
- Postgresql:dopasowywanie wzorców między dwiema kolumnami
- Szybkie znajdowanie podobnych ciągów za pomocą PostgreSQL
Twoje zapytanie musi pasować do wyrażenia indeksu, aby móc z niego skorzystać.
SELECT label
FROM the_table
WHERE lower(unaccent_text(label)) % 'fil'
ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Jednak „filbert” i „filé powder” nie są w rzeczywistości bardzo podobne do „fil” według operatora %. Podejrzewam, że naprawdę chcesz tego:
SELECT label FROM the_table WHERE lower(unaccent_text(label)) ~~ '%fil%' ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Spowoduje to wyszukanie wszystkich ciągów zawierających wyszukiwany ciąg i posortowanie najlepszych dopasowań zgodnie z %
najpierw operator.
I soczysta część:wyrażenie może używać indeksu GIN lub GiST od PostgreSQL 9.1 ! Cytuję instrukcję dotyczącą modułu pg_trgm:
Począwszy od PostgreSQL 9.1, te typy indeksów obsługują również wyszukiwanie indeksów dla LIKE i ILIKE, na przykład
Jeśli rzeczywiście chciałeś użyć %
operator:
Czy próbowałeś obniżyć próg? dla operatora podobieństwa %
z set_limit()
:
SELECT set_limit(0.1);
czy nawet niższy? Wartość domyślna to 0,3. Tylko po to, żeby sprawdzić, czy jest to próg, który filtruje dodatkowe dopasowania.