Postgres全文与Rails 3中的部分单词不匹配?

时间:2011-02-23 02:18:16

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

我刚从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 时,我什么都没得到?

感谢您提供任何线索。

4 个答案:

答案 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