возможно сделать это с помощью tsvector:
with data as (
select * from (
VALUES (1, 'Blue pill'),
(2, 'Red pill'),
(3, 'Blue shift'),
(4, 'Red eye')
) v(id, t)
)
select id, lexeme, positions
FROM data
CROSS JOIN unnest(to_tsvector(t)) u(lexeme, positions, weights)
WHERE (lexeme = 'red' and positions @> '{1}')
OR (lexeme = 'pill' and positions @> '{2}');
id | lexeme | positions
----+--------+-----------
1 | pill | {2}
2 | pill | {2}
2 | red | {1}
4 | red | {1}
(4 rows)
Я думаю, что, вероятно, проще сделать это с помощью регулярного выражения.