Не използвате операторския клас, предоставен от pg_trgm
модул. Бих създал индекс като този:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Първоначално имах GIN индекс тук, но по-късно научих, че GiST вероятно е дори по-подходящ за този вид заявка, защото може да връща стойности, сортирани по сходство. Повече подробности:
- Postgresql:Съвпадение на модели между две колони
- Бързо намиране на подобни низове с PostgreSQL
Вашата заявка трябва да съответства на индексния израз, за да можете да го използвате.
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
Въпреки това, "filbert" и "filé prah" всъщност не са много подобни на "fil" според % оператора. Подозирам, че това, което наистина искате, е това:
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
Това ще намери всички низове, съдържащи низа за търсене, и ще сортира най-добрите съвпадения според %
първо оператор.
И сочната част:изразът може да използва GIN или GiST индекс от PostgreSQL 9.1 ! Цитирам ръководството на pg_trgm moule:
Започвайки от PostgreSQL 9.1, тези типове индекси също поддържат търсене в индекси за LIKE и ILIKE, например
Ако всъщност сте имали предвид да използвате %
оператор:
Пробвали ли сте даснижите прагата за оператора за сходство %
с set_limit()
:
SELECT set_limit(0.1);
или дори по-ниско? По подразбиране е 0.3. Само за да видите дали това е прагът, който филтрира допълнителни съвпадения.