Ответ 1
Не уверен, что этот ответ полезен с учетом возраста вопроса, но:
Относительно стебления
Кажется, вы правы:
select ts_lexize('english_stem','recreation');
выходы
ts_lexize
-----------
{recreat}
(1 row)
и документация говорит
Кроме того, * можно привязать к лексеме для указания соответствия префикса:
SELECT to_tsquery('supern:*A & star:A*B');
Такая лексема будет соответствовать любому слову в tsvector, который начинается с данной строки.
Итак, похоже, что невозможно выполнить оригинальный запрос.
Решение, основанное на частичном согласовании
Можно было отказаться от поиска частичных совпадений стеблей и запроса, например. используя pg_trgm
расширение:
SELECT (to_tsvector('recreation creation') @@ to_tsquery('recreatio:*')) or
'recreatio:*' % any (
select trim(both '''' from regexp_split_to_table(strip(to_tsvector('recreation creation'))::text, ' '))
);
(Может быть, массив стеблей может быть сформирован более элегантным способом.)