如何在postgres全文搜索中使用替代方法构建tsquery

时间:2016-10-26 20:41:13

标签: postgresql full-text-search postgresql-9.1

我在postgres DB中的某些表上配置了全文搜索。当我尝试用超过1个单词构建tsquery时,我会在tsquery中使用& (AND)作为分隔符。实际上,我找不到的结果只是我问过的一个词。

示例:

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

当我要求"非常奇怪"我的tsquery看起来像'very' & 'strange' ,对于ID == 1,该tsquery的等级(ts_rank_cd)大于0,对于ID == 2为0。

我的目标是达到排名> 0表示第二句。

任何想法/提示/解决方案?

2 个答案:

答案 0 :(得分:3)

您可以通过执行以下操作来创建OR的{​​{1}}版本:

plainto_tsquery

类似于klin的建议,但是利用了select replace(plainto_tsquery('foo bar')::text, '&', '|')::tsquery; 的词干处理功能。

顺便说一句,我相信plainto_tsquery是一个停用词,因此不会包含在任何veryto_tsquery输出中。

答案 1 :(得分:1)

在tsquery中使用OR代替AND

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;