2016-10-26 21 views
0

我已經在postgres數據庫中的某些表上配置了全文搜索。當我嘗試用超過1個單詞構建tsquery時,我在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' 和隊伍(ts_rank_cd)爲tsquery大於0只爲ID == 1,對ID == 2爲0.

我的目標是爲第二句話達到等級> 0。

任何想法/技巧/解決方案?

回答

0

使用OR而不是AND在tsquery:

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

是的,需要更改爲OR,但以更通用的方式。當用戶給我其他查詢時,應該使用任何函數或參數以更「自動」的方式完成。我不想分析和更改每個用戶查詢。 – Son