2016-10-26 7 views
0

私はpostgres DBの一部のテーブルで全文検索を設定しました。私が1つ以上の単語でtsqueryを構築しようとすると、私は区切り文字として&(AND)を使って単語を取得します。実際に私は結果を見つけることができませんが、私が尋ねた言葉の一つだけです。postgresの全文検索の代わりにtsqueryを構築する方法

例:

| ID | Name | Description   | Rank | 
|----|---------|---------------------|------| 
| 1 |Somethink|This is very strange | 0.2 | 
| 2 |Other |This is strange a bit| 0 | 

私が求める "非常に奇妙な" 私のtsqueryは、その'very' & 'strange' のように見え、そののtsqueryのためのランク(ts_rank_cd)が0よりも唯一のID == 1のために、ID用== 2は0です。

私の目標は、2番目の文のランク> 0を達成することです。

アイデア/ヒント/ソリューション代わりのtsquery中AND

答えて

0

使用OR

with data(d) as (
values 
    ('This is very strange'), 
    ('This is strange a bit') 
) 
select d, ts_rank_cd(to_tsvector(d), 'strange | very'::tsquery) 
from data 

      d   | ts_rank_cd 
-----------------------+------------ 
This is very strange |  0.2 
This is strange a bit |  0.1 
(2 rows)  

あなたは自動的例えば、機能replace()を使用して、ユーザー入力を変更することができます。

with data(d) as (
values 
    ('This is very strange'), 
    ('This is strange a bit') 
), 
query (query) as (
values 
    ('very & strange') 
) 
select d, ts_rank_cd(to_tsvector(d), replace(query, '&', '|')::tsquery) 
from data 
cross join query; 
+0

はい、変更したり、したりする必要性を、しかしより一般的な方法で。ユーザーが他のクエリを与えるときは、関数やパラメータを使用して、より "自動"な方法で行う必要があります。私はすべてのユーザークエリを解析して変更したくありません。 – Son

関連する問題