Получить доступ

Почему полнотекстовый поиск не делают запросом LIKE '%слово%'?

JuniorПолнотекстовый поискSQL
Ещё спрашивают так:
  • Почему LIKE плох для поиска?
Коротко

LIKE '%слово%' не использует обычный индекс (ведущий шаблон) — читает всю таблицу, и качество поиска примитивное: нет морфологии, опечаток, ранжирования.

  • В PostgreSQL: полнотекстовый поиск (tsvector, GIN) или pg_trgm для подстрок
  • Для серьёзного поиска — Elasticsearch / OpenSearch
  • LIKE 'слово%' (префикс) может использовать B-дерево

А ещё «кошками» не найдёт «кошка» без морфологии

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Проблем две, и обе существенные. Производительность: стоимость растёт линейно с объёмом текста, потому что база вынуждена просмотреть каждую строку. Качество: пользователь ищет «купить телефон», а в тексте «телефоны купили» — точного вхождения нет, и поиск ничего не найдёт; ранжирования результатов тоже не будет. Поисковые системы решают обе задачи, заранее разбирая текст на термины и строя по ним индекс.

Что хотят услышать

  • Почему индекс не работает.
  • Недостатки качества поиска.
  • Альтернативы.

Частые ошибки

  • Оставлять поиск на LIKE до момента, когда объём данных вырастет.
  • Ожидать от такого поиска релевантной сортировки результатов.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Такой запрос заставляет просматривать все строки целиком и не умеет учитывать словоформы, опечатки и релевантность
  • ✗Оператор LIKE не поддерживает кириллицу
  • ✗LIKE работает только с колонками фиксированной длины
  • ✗LIKE запрещён стандартом SQL для текстовых полей

Что спросят дальше

  • Как устроен инвертированный индекс?
  • Что происходит с текстом на этапе анализа?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем