$users = User::query()->whereHas('keywords', function($query) use($vacancy){
return $query->whereIn('keyword', $vacancy->keywords->pluck('keyword'));
})->get();


key_words: ключевые слова из формы
при создании вакансии: description
-- при создании вакансии нужно заполнить индекс
insert into "vacancy_fts" ("vacancy_id", "vector") select v.id,
setweight(to_tsvector('russian_ispell',v.name), 'A') ||
setweight(to_tsvector('russian_ispell',coalesce(v.description,'')), 'B') ||
setweight(to_tsvector('russian_ispell',coalesce(k.tags,'')), 'D') -- pseudo
from "vacancies" as "v" left join "keywords" as k -- on ...
where v.id=:idDB::table('vacancy_fts')
->whereFullText('vector', 'web developer')
->get(); SELECT s.user_id FROM subscription_fts as u
LEFT JOIN vacancy_fts as v ON s.vector = v.vector
WHERE v.id = :id
CREATE TABLE vacancies
(
id BIGSERIAL PRIMARY KEY,
name TEXT,
description TEXT,
search_vector tsvector GENERATED ALWAYS AS (to_tsvector('russian', name || ' ' || description)) stored
);
CREATE INDEX vacancies_search_vector_idx ON vacancies USING gin(search_vector);
explain (analyze, timing off, summary off) SELECT * FROM vacancies WHERE search_vector @@ to_tsquery('russian', 'программист');
а то что у меня в полях name, description тип поля указан как jsonB
insert into "vacancy_fts" ("vacancy_id", "vector") select v.id,
setweight(to_tsvector('russian_ispell',v.name), 'A') ||
search_vector tsvector GENERATED ALWAYS AS