如何在postgres全文搜索中使用替代方法构建tsquery
问题描述:
我已经在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。
任何想法/技巧/解决方案?
答
使用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;
是的,需要更改为OR,但以更通用的方式。当用户给我其他查询时,应该使用任何函数或参数以更“自动”的方式完成。我不想分析和更改每个用户查询。 – Son