Postgres, выбивающий матчи

Запрос

SELECT to_tsvector('recreation') @@ to_tsquery('recreatio:*');

возвращает false, хотя "recreati" является префиксом "отдыха". Это, похоже, происходит потому, что "отдых" хранится как его основа, "отступать". Например, если мы намеренно нарушаем алгоритм сужения, запустив

SELECT to_tsvector('recreation1') @@ to_tsquery('recreatio:*');

запрос возвращает true.

Есть ли способ совпадения первого запроса?

Ответ 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, ' '))
  );

(Может быть, массив стеблей может быть сформирован более элегантным способом.)