GIN-индекс
Generalized Inverted Index в PostgreSQL — инвертированный индекс для значений из нескольких компонентов: массивов, JSONB, полнотекстового поиска и триграмм. Быстро отвечает на вопрос «содержит ли это такой-то элемент?».
Примеры: WHERE tags @> '{postgres}' (массив содержит), поиск по ключам JSONB (data @> '{"status":"active"}'), полнотекстовый поиск (tsvector @@ tsquery), нечёткий поиск по триграммам (pg_trgm для LIKE '%foo%'). Инвертированный индекс сопоставляет каждому подзначению список строк, где оно встречается — как предметный указатель в конце книги. Цена: поиск быстрый, но запись дороже, ведь одна строка обновляет сразу несколько записей индекса; смягчают это fastupdate и отложенный список GIN. Не путать с B-tree (равенство и порядок по значению целиком) и GiST (геометрия и близость). Выбор по умолчанию для JSONB и полнотекстового поиска в Postgres.