Вы можете сделать последнюю лексему в tsquery совпадением префикса, приведя ее к строке, добавив ': *', а затем приведя обратно к tsquery:
=> SELECT ((to_tsquery('foo <-> bar')::text || ':*')::tsquery);
tsquery
-------------------
'foo' <-> 'bar':*
Для вашего варианта использования выВы захотите использовать <->
вместо &
, чтобы слова были рядом друг с другом.Вот демонстрация того, как они отличаются:
=> SELECT 'foo bar baz' @@ tsquery('foo & baz');
?column?
----------
t
(1 row)
=> SELECT 'foo bar baz' @@ tsquery('foo <-> baz');
?column?
----------
f
(1 row)
phraseto_tsquery
позволяет легко указать много слов, которые должны быть рядом друг с другом:
=> SELECT phraseto_tsquery('foo baz');
phraseto_tsquery
------------------
'foo' <-> 'baz'
Поместить еговсе вместе:
=> SELECT (phraseto_tsquery('The fat ra')::text || ':*')::tsquery;
tsquery
------------------
'fat' <-> 'ra':*
В зависимости от ваших потребностей, более простым способом может быть создание запроса непосредственно со строкой, а затем приведение:
=> SELECT $$'fat' <-> 'ra':*$$::tsquery;
tsquery
------------------
'fat' <-> 'ra':*