查询
SELECT to_tsvector('recreation') @@ to_tsquery('recreatio:*');
即使'recreati'是'recreation'的前缀,也返回false。发生这种情况似乎是因为“娱乐”被存储为词根“重新创建”。例如,如果我们故意通过运行来破坏词干算法
SELECT to_tsvector('recreation1') @@ to_tsquery('recreatio:*');
查询返回true。

有没有办法使第一个查询匹配?

最佳答案

考虑到问题的年龄,不确定该答案是否有用,但是:
关于词干
看来您是对的:

select ts_lexize('english_stem','recreation');
输出
 ts_lexize
-----------
 {recreat}
(1 row)
然后documentation

因此,似乎没有办法使原始查询匹配。
基于部分匹配的解决方案
可以退一步来寻找词干和查询的部分匹配,例如使用 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, ' '))
  );
(也许可以以更优雅的方式形成茎的排列。)

关于postgresql - Postgres阻止比赛,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31999511/

10-11 08:50