admin

PostgreSQL与全文搜索完全匹配

sql

如何搜索与搜索短语匹配的行?如果搜索查询是 有趣的狗

我需要得到结果,其中搜索字段 仅以 任何顺序(狗,有趣,最有趣…)以任意顺序包含这两个单词“ funny”和“
dog”,并跳过介词和冠词(a,the和, 的…)


阅读 152

收藏
2021-07-01

共1个答案

admin

考虑到PostgreSQL使用的英语词干分析器不会阻止比较词和最高级词(我必须认为这是设计使然,而不仅仅是错误),所以在PostgreSQL中没有合理的方法可以做到这一点。

select to_tsvector('english','funny funnier funniest big bigger biggest');
                            to_tsvector                            
-------------------------------------------------------------------
 'big':4 'bigger':5 'biggest':6 'funni':1 'funnier':2 'funniest':3

但是,如果您安装english_hunspell词典(本身并不琐碎),那么您可以更接近所需的内容,至少对于您给出的一个示例。

create text search configuration english_hun (copy = english);
ALTER TEXT SEARCH CONFIGURATION english_hun alter mapping replace english_stem with english_hunspell;
select to_tsvector('english_hun','funny funnier funniest big bigger biggest');
                 to_tsvector                  
----------------------------------------------
 'big':4 'bigger':5 'biggest':6 'funny':1,2,3

最常见的介词已经是停用词,但不是全部,因此您可能需要调整停用词列表。

完成常规匹配(@@)之后,您可以添加AND条件,以确保tsvector和tsquery的长度相同。这将与“有趣的狗逗”相匹配,无论您是否想要,我都不清楚。

2021-07-01