如何搜索与搜索短语匹配的行?如果搜索查询是 有趣的狗
我需要得到结果,其中搜索字段 仅以 任何顺序(狗,有趣,最有趣…)以任意顺序包含这两个单词“ funny”和“ dog”,并跳过介词和冠词(a,the和, 的…)
考虑到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的长度相同。这将与“有趣的狗逗”相匹配,无论您是否想要,我都不清楚。