我在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表示第二句。
任何想法/提示/解决方案?
答案 0 :(得分:3)
您可以通过执行以下操作来创建OR
的{{1}}版本:
plainto_tsquery
类似于klin的建议,但是利用了select replace(plainto_tsquery('foo bar')::text, '&', '|')::tsquery;
的词干处理功能。
顺便说一句,我相信plainto_tsquery
是一个停用词,因此不会包含在任何very
或to_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;