ILIKE
всегда будет пытаться сопоставить всю строку.Например, чтобы соответствовать ILIKE '%book club%'
, строке необходимо , чтобы включить всю строку book club
.
Если вы хотите использовать потенциал совпадения подобия pg_trm
, вам необходимоиспользуйте соответствующие операторы, для которых он был разработан.Взято из документа :
%
возвращает значение true, если его аргументы имеют сходство, которое больше текущего порога сходства, установленного параметром pg_trgm.simility_threshold. <%
возвращает значение true, если сходство между триграммой, заданной в первом аргументе, и непрерывным экстентом упорядоченной триграммы, заданной во втором аргументе, превышает текущий порог сходства слов, установленный параметром pg_trgm.word_simility_threshold.
Дополнительное примечание # 1 : сделайте его без учета регистра, добавив lower(...)
в определение индекса и в свои запросы.
Дополнительное примечание # 2 :title || ' ' || description
вернет NULL
, если title
или description
НЕДЕЙСТВИТЕЛЕН.Если вы хотите защититься от того, что одно из 2 значений равно NULL, создайте индекс для COALESCE(title, '') || ' ' || COALESCE(description, '')
Примечание: 3 : pg_trgm может делать только так много.Для действительно сложных запросов вам может понадобиться полнотекстовый поиск