2016-10-26 19 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