2

搜索类似pro-physik.detsquery 的表达式时,我得到了一个奇怪的结果。

如果我pro-physik:*通过 tsquery 要求,我想获得所有以 . 开头的条目pro-physik。不幸的是,那些条目pro-physik.de丢失了。

这里有 2 个例子来说明这个问题:

查询一:

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

有谁知道我该如何解决这个问题?

4

1 回答 1

4

问题的核心是解析器将解析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-p所有三个都是前缀。prep

作为一种解决方法,使用这样的全文搜索:

select 
   to_tsvector('simple', replace('pro-physik.de', '.', ' ')) @@ 
   to_tsquery('simple', replace('pro-physik:*', '.', ' '))
于 2016-07-22T12:37:47.063 回答