2

pro-physik.detsqueryのような式を検索すると、奇妙な結果が得られました。

tsqueryで要求すると、 で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

この問題を解決する方法を知っている人はいますか?

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)

1 つ目は の接頭辞ではないtsqueryため一致しません。2 つ目は であり、3 つすべてが接頭辞であるため一致します。physikpro-physik.depro-pprep

回避策として、次のように全文検索を使用します。

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