← Все навыки

Полнотекстовый поиск в БД: Postgresql vs Elasticsearch

Быстрый и устойчивый к опечаткам полнотекстовый поиск: где хватит PostgreSQL, а где нужен Elasticsearch — выбор технологии, индексы, ранжирование и интеграция поиска в приложение

8 тем PostgreSQL FTS и Elasticsearch Индивидуально с ментором

Для кого этот навык

  • Backend-разработчики, которым нужно сделать поиск лучше, чем LIKE '%...%'
  • Инженеры, выбирающие между поиском в PostgreSQL и отдельным движком
  • Все, кто хочет понимать, как устроены инвертированный индекс и ранжирование

Программа

Зачем нужен полнотекстовый поиск

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

Полнотекстовый поиск в PostgreSQL

tsvector/tsquery, GIN/GiST/RUM, ранжирование
  • tsvector и tsquery, оператор @@, нормализация, лемматизация, стоп-слова
  • Типы индексов GIN, GiST, RUM и их устройство (inverted index, posting list)
  • Компромиссы скорости поиска/обновления и ранжирование по релевантности

Elasticsearch

index/mapping, Query DSL, fuzziness, autocomplete
  • Обзор движков (Sphinx, Solr, Elasticsearch/OpenSearch) и критерии выбора
  • Установка в Docker, REST/curl, index, документы и mapping, шарды и реплики
  • Поиск и фильтрация через Query DSL (bool, range) и SQL-режим
  • Поиск с опечатками (fuzziness) и автодополнение (edge_ngram)

Интеграция поиска в приложение

search-service, синхронизация БД ↔ Elasticsearch
  • Микросервис search-service: индексация при изменениях и обработка запросов
  • Синхронизация основной базы и Elasticsearch (очередь/webhook, bulk API)

Практика: поиск для музыкальной платформы «ТУНЕЦ»

Сквозное задание: поиск по трекам, исполнителям, альбомам, жанрам и тексту песен — устойчивый к опечаткам

  • Выбрать, что индексировать, и настроить маппинг с анализаторами (edge_ngram для автодополнения)
  • Реализовать микросервис search-service: индексация при изменениях и обработка запросов
  • Настроить очередь или webhook как триггер индексации, использовать bulk API
  • Поиск с учётом опечаток (fuzziness), автодополнение, приоритизация популярных треков
  • С ментором: разбор маппинга, архитектуры сервиса и схемы синхронизации с основной базой
  • На выходе — код сервиса, документация по индексу и презентация с рисками и ограничениями