在rails / Postgres中使用to_tsquery如何在单词中搜索字符串?

时间:2014-11-13 12:55:50

标签: ruby-on-rails postgresql search full-text-search where

我的搜索效果非常好,但有一种类型的搜索缺失。

所以我有这个搜索'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搜索?

感谢。

1 个答案:

答案 0 :(得分:0)

Postgres文本搜索可以匹配完整的单词,例如campaign,或camp:*等字词前缀,但不会匹配字词内部或结尾。

您可以反转 tsvector(to_tsvector(reverse(name))中的所有内容,并为广告系列进行前缀搜索,例如reverse('mpaign') || ':*'

否则,您应该将LIKE运算符与%通配符一起使用,最好使用trgm index

where name LIKE '%mpaign'