使用Postgresql下的to_tsquery进行奇怪的结果搜索

时间:2016-07-22 11:21:45

标签: postgresql full-text-search postgresql-9.2 tsvector

我得到了一个奇怪的结果,用tsquery搜索pro-physik.de这样的表达式。

如果我通过tsqu​​ery请求pro-physik:*,我希望获得所有以pro-physik开头的条目。不幸的是,pro-physik.de的条目丢失了。

以下是2个展示问题的示例:

查询1:

select 
    to_tsvector('simple', 'pro-physik.de') @@ 
    to_tsquery('simple', 'pro-physik:*') = true

结果1:false(应为true

查询2:

select 
    to_tsvector('simple', 'pro-physik.de') @@
    to_tsquery('simple', 'pro-p:*') = true

结果2:true

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

问题的核心是解析器将pro-physik.de解析为主机名:

SELECT alias, token FROM ts_debug('simple', 'pro-physik.de');

 alias |     token
-------+---------------
 host  | pro-physik.de
(1 row)

比较一下:

SELECT alias, token FROM ts_debug('simple', 'pro-physik-de');
      alias      |     token
-----------------+---------------
 asciihword      | pro-physik-de
 hword_asciipart | pro
 blank           | -
 hword_asciipart | physik
 blank           | -
 hword_asciipart | de
(6 rows)

现在pro-physikpro-p 不是主机名,所以你得到了

SELECT to_tsquery('simple', 'pro-physik:*');
              to_tsquery
---------------------------------------
 'pro-physik':* & 'pro':* & 'physik':*
(1 row)

SELECT to_tsquery('simple', 'pro-p:*');
         to_tsquery
-----------------------------
 'pro-p':* & 'pro':* & 'p':*
(1 row)

第一个tsquery将不匹配,因为physik不是pro-physik.de的前缀,而第二个将匹配,因为pro-ppre和{{ 1}}这三个都是前缀。

作为解决方法,请使用如下全文搜索:

p