Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PostgreSQLВсе вопросы
PostgreSQLMiddleТеория

Что такое full-text search в Postgres (tsvector, tsquery, to_tsvector)? Когда хватает Postgres, а когда уходить в Elasticsearch?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

tsvector хранит лексемы документа, tsquery — поисковый запрос; оператор @@ ищет совпадения через GIN-индекс. Postgres FTS хватает для простых задач до ~10M документов; Elasticsearch нужен для fuzzy, автодополнения, фасетов и горизонтального масштабирования.

Как устроен full-text search в PostgreSQL

PostgreSQL реализует FTS через два типа данных:

  • tsvector — нормализованный документ: набор лексем с позициями. Хранится в столбце таблицы или вычисляется на лету.
  • tsquery — поисковый запрос: термины с операторами & (AND), | (OR), ! (NOT), <-> (фраза).
-- Базовый пример
SELECT to_tsvector('russian', 'PostgreSQL предоставляет мощный поиск по тексту');
-- 'мощн':4 'поиск':5 'предоставля':2 'текст':7

SELECT to_tsquery('russian', 'поиск & текст');
-- 'поиск' & 'текст'

-- Поиск с рангом
SELECT
    id,
    title,
    ts_rank(search_vector, query) AS rank
FROM articles,
     to_tsquery('russian', 'PostgreSQL & поиск') query
WHERE search_vector @@ query
ORDER BY rank DESC
LIMIT 20;

Хранение tsvector и индекс

-- Добавить вычисляемый столбец (PostgreSQL 12+)
ALTER TABLE articles
    ADD COLUMN search_vector tsvector
    GENERATED ALWAYS AS (
        setweight(to_tsvector('russian', coalesce(title, '')), 'A') ||
        setweight(to_tsvector('russian', coalesce(body, '')), 'B')
    ) STORED;

-- GIN-индекс для @@ оператора
CREATE INDEX ON articles USING GIN(search_vector);

-- Поиск фразой (слова рядом)
SELECT title FROM articles
WHERE search_vector @@ to_tsquery('russian', 'машинное <-> обучение');

websearch_to_tsquery — удобный парсер пользовательского ввода

-- Принимает "обычный" поисковый запрос без спецсимволов
SELECT websearch_to_tsquery('russian', 'PostgreSQL full text search');
-- 'postgresql' & 'full' & 'text' & 'search'

-- С минусом для исключения
SELECT websearch_to_tsquery('russian', 'PostgreSQL -MySQL');

Когда PostgreSQL FTS достаточно

  • Небольшие и средние объёмы (до ~10 млн документов) с умеренной нагрузкой на поиск.
  • Поиск по строго определённым языкам с настроенным словарём (russian, english).
  • Нет требований к подсказкам (autocomplete), опечаткам (fuzzy), фасетам по произвольным полям.
  • Поиск нужен как дополнительная фича, а не основная — не хочется поднимать отдельный сервис.
  • Нужна транзакционная согласованность: поиск по только что вставленной строке сразу после INSERT.

Когда уходить в Elasticsearch (или Meilisearch, Typesense)

  • Fuzzy search / опечатки: Postgres не умеет искать «питон» по запросу «пиотн». Elasticsearch использует BM25 + Levenshtein из коробки.
  • Автодополнение и suggester: edge n-gram / completion suggester в ES; в Postgres придётся делать pg_trgm + GIN, что хуже по качеству.
  • Многоязычный поиск без явного указания языка: Postgres требует задать словарь; ES определяет язык автоматически.
  • Фасетная навигация с агрегациями: счётчики по категориям, диапазоны цен — Postgres считает это полным seq scan.
  • Масштаб > 50 млн документов с sub-100ms latency: ES горизонтально масштабируется, Postgres — нет.
  • Relevance tuning: настройка весов полей, field boosting, синонимы, стоп-слова — в ES всё это конфигурируется без кода.

Подводные камни

  • GENERATED ALWAYS AS STORED пересчитывается при каждом UPDATE строки — при массовых обновлениях это может быть дороже ожидаемого. Альтернатива: триггер или фоновая задача.
  • GIN-индекс медленно строится при большом объёме данных и блокирует VACUUM на таблице. Используйте CREATE INDEX CONCURRENTLY.
  • Слово «не» в русском тексте: стандартный словарь russian удаляет его как стоп-слово, что ломает поиск отрицаний. Нужно кастомизировать словарь.
  • to_tsvector без явного языка использует default_text_search_config (обычно english) — русские слова не нормализуются, поиск не работает.
  • ts_rank не учитывает свежесть документа — нужно комбинировать с датой вручную: rank * exp(-age_days / 30.0).
  • Поиск по числам и кодам (артикулам, UUID) — FTS их разбивает по дефисам и точкам. Лучше использовать обычный LIKE или pg_trgm.
  • Большой tsvector в STORED-колонке увеличивает размер таблицы и замедляет vacuum. Следите за pg_relation_size() до и после добавления колонки.

Типичные ошибки

  • Искать через ILIKE '%term%' на больших таблицах.
  • Не выбирать языковую конфигурацию.
  • Уходить в Elasticsearch без требований.

Что проверяет интервьюер

  • Просит объяснить tsvector/tsquery.
  • Проверяет GIN index.
  • Уточняет границу Postgres vs search engine.

Как вы знаете этот вопрос?

Проверить себя по теме PostgreSQL →

Источники

  • https://www.postgresql.org/docs/current/textsearch.html
  • https://www.postgresql.org/docs/current/indexes-types.html

Связанные темы

PostgreSQLindex-designsearch-design

Вакансии с этим навыком

PostgreSQL вакансии
  • Fullstack-разработчик (Middle+ / Senior)
  • Fullstack-разработчик
  • Propulsion Software Engineer (Falcon Engineering)
  • Software Engineer, Manufacturing
  • Software Engineer, Full Stack (Data & Video Analysis)

Частые вопросы на собеседовании

  • Что делает VACUUM, VACUUM FULL, ANALYZE? Чем они отличаются и какой когда применять?
  • Какие уровни изоляции есть и чем отличаются (READ COMMITTED, REPEATABLE READ, SERIALIZABLE)? Какой по умолчанию в Postgres?
  • Что такое PITR и чем pg_dump отличается от base backup + WAL archive?
  • Каковы типы индексов в PostgreSQL (B-tree, Hash, GIN, GiST, BRIN)?