FTS не підтримує 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
і для регулярних виразів, майте на увазі, що візерунок без триграмів, що витягуються, перероджується до сканування з повним індексом.
Це означає, що сканування індексу / растрових зображень все ще працює (плани запитів для підготовленої операції не зламаються), вона просто не дасть вам кращої продуктивності. Зазвичай великі втрати не мають, оскільки рядки з 1 або 2 літерами навряд чи є вибірковими (більше ніж кілька відсотків збігів основної таблиці), а підтримка індексу не покращить продуктивність для початку, оскільки повне сканування таблиці відбувається швидше.
text_pattern_ops
для відповідності префікса
Для лише лівозакріплених шаблонів (без провідних підстановок) ви отримуєте оптимум із відповідним класом операторів для btree index: 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: