Самое простое решение - просто создать индекс pg_trgm .
create extension pg_trgm;
create index on product using gin (description gin_trgm_ops);
Затем вы можете использовать тот же запрос, только удалить LOWER и изменить LIKE на ILIKE.
Вероятно, этого должно быть достаточно, но если это не так, вы можете сделать более целенаправленный индекс. Вам нужно будет создать вспомогательную функцию для выполнения агрегации, так как вы не можете поместить агрегат непосредственно в функциональный индекс.
create function extract_tokens(text) returns text[] immutable language sql as $$
select array_agg(regexp_matches[1]) from
regexp_matches ($1, '\{add\}(\d+)\{\/add\}+','g')
$$;
Обратите внимание, что я переместил круглые скобки, чтобы они получали только цифры, а не окружающие метки, которые просто кажутся шумом. Тот факт, что были совпадения, свидетельствует о том, что они были там, нам не нужно их видеть.
create index on product using gin (extract_tokens(description))
select * from product where extract_tokens(description) @> ARRAY['185'];