我的搜索效果非常好,但有一种类型的搜索缺失。
所以我有这个搜索'name'列非常好但是它不匹配搜索词位于单词内的字符串:
def self.search(query)
query.gsub!(/[^a-z0-9\@\.\+]/i, ' ')
where("(to_tsvector('english', name) @@ to_tsquery(?))", query.gsub(' ', '\\\\ ') + ':*')
end
例如:
假设用户搜索“mpaign”
我希望返回带有“广告系列”的标题,因为“mpaign”会出现在其中,但这种情况并未发生。
如何在这样的单词中进行to_tsquery搜索?
感谢。
答案 0 :(得分:0)
Postgres文本搜索可以匹配完整的单词,例如campaign
,或camp:*
等字词前缀,但不会匹配字词内部或结尾。
您可以反转 tsvector(to_tsvector(reverse(name)
)中的所有内容,并为广告系列进行前缀搜索,例如reverse('mpaign') || ':*'
。
否则,您应该将LIKE运算符与%通配符一起使用,最好使用trgm index。
where name LIKE '%mpaign'