我刚从MySQL转到Postgres 9.0.3。我有一个带有少量数据的全新应用程序(游戏数据)。
无论如何,我似乎无法获得部分搜索词。这是我的搜索方法:
def self.search(query)
conditions = <<-EOS
to_tsvector('english', title) @@ plainto_tsquery('english', ?)
EOS
find(:all, :conditions => [conditions, query])
end
我确定我需要一张通配符,但我只是在学习Postgres。
当我搜索 Shinobi
时,我得到了正确的结果:
Alex Shind在Shinobi World - Sega Master System
Shinobi - Sega Master System
Shinobi - 任天堂娱乐系统
Cyber Shinobi:Shinobi第2部分 - Sega Master System
但是当我搜索 Shin
时,我什么都没得到?
感谢您提供任何线索。
答案 0 :(得分:3)
我认为允许前缀匹配需要使用to_tsquery而不是plainto_tsquery
表示http://www.postgresql.org/docs/current/static/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES
因此您的代码可能类似于
def self.search(query)
conditions = <<-EOS
to_tsvector('english', title) @@ to_tsquery('english', ?)
EOS
find(:all, :conditions => [conditions, query + ':*'])
end
答案 1 :(得分:2)
您还可以使用正则表达式搜索,如下所示。
find( :all, :conditions => [ 'name ~* ?', "SEARCH TERM" ] )
答案 2 :(得分:0)
在查询字符串中附加*
。
搜索Shin*
。
def self.search(query)
conditions = <<-EOS
to_tsvector('english', title) @@ plainto_tsquery('english', ?)
EOS
find(:all, :conditions => [conditions, query.concat("*")])
end
答案 3 :(得分:0)
使用IBaseDAO
:
prefix