ФНС не поддерживает LIKE
Ранее принят ответ был неверным. Полнотекстовый поиск с его полнотекстовыми индексами вообще не для LIKE
оператора, он имеет свои операторы и не работает для произвольных строк. Он оперирует словами на основе словарей и корней. Это делает поддержку согласования префикса для слов , но не с LIKE
оператором:
Индексы триграмм для LIKE
Установите дополнительный модуль, pg_trgm
который предоставляет классы операторов для индексов триграмм GIN и GiST для поддержки всех LIKE
и ILIKE
шаблонов , а не только с левым якорем:
Пример индекса:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
Или:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
Пример запроса:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Триграммы? А как насчет более коротких струн?
Слова с менее чем 3 буквами в индексированных значениях по-прежнему работают. Руководство:
При определении набора триграмм, содержащихся в строке, считается, что каждое слово имеет два префикса и один суффикс.
И поисковые шаблоны с менее чем 3 буквами? Руководство:
При LIKE
поиске как по регулярным выражениям, так и по регулярным выражениям имейте в виду, что шаблон без извлекаемых триграмм будет вырожден в сканирование полного индекса.
Это означает, что сканирование индекса / растрового индекса по-прежнему работает (планы запросов для подготовленного оператора не нарушаются), это просто не даст вам лучшей производительности. Как правило, нет больших потерь, поскольку одно- или двухбуквенные строки вряд ли являются избирательными (более нескольких процентов совпадений с базовой таблицей), а поддержка индекса не улучшит производительность с самого начала, потому что полное сканирование таблицы выполняется быстрее.
text_pattern_ops
для сопоставления префикса
Только для шаблонов с левым якорем (без ведущего подстановочного знака) вы получите оптимум с подходящим классом операторов для индекса btree: text_pattern_ops
или varchar_pattern_ops
. Обе встроенные функции стандартного Postgres, дополнительный модуль не требуется. Аналогичная производительность, но гораздо меньший индекс.
Пример индекса:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Пример запроса:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Или , если вы должны запускать свою базу данных с локалью «C» (фактически без локали), тогда все в любом случае сортируется в соответствии с порядком байтов, и простой индекс btree с классом оператора по умолчанию выполняет свою работу.
Более подробная информация, объяснение, примеры и ссылки в этих связанных ответах на dba.SE: