Postgres干掉了比赛

时间:2015-08-13 22:33:58

标签: postgresql full-text-search

查询

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

即使' recreati'

返回false也是如此。是娱乐的前缀'。这似乎是因为'娱乐'作为其词干存储,'撤退'。例如,如果我们通过运行

故意破坏词干分析算法

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

查询返回true。

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

1 个答案:

答案 0 :(得分:1)

根据问题的年龄,不确定这个答案是否有用,但是:

关于阻止

看来你是对的:

select ts_lexize('english_stem','recreation');

输出

 ts_lexize
-----------
 {recreat}
(1 row)

documentation

  

此外,*可以附加到词位以指定前缀匹配:

     

SELECT to_tsquery('supern:*A & star:A*B');

     

这样的lexeme将匹配以给定字符串开头的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, ' '))
  );

(也许茎的阵列可以以更优雅的方式形成。)