编写一个松散匹配的搜索方法

时间:2011-05-30 20:09:31

标签: ruby-on-rails ruby-on-rails-3 search railscasts

我刚刚看过有关simple search form的关于我的应用,我想在我的应用中做类似的事情,但我不想找到完全匹配的结果。

我有一个名为Project的模型,其中包含以下字段:

  • name
  • description
  • keyword1
  • keyword2

鉴于从railscast获取的代码:

models/project.rb

def self.search(search)
    if search
        find( :all, :conditions => ['name LIKE ?', "%#{search}%"] )
    else
        find(:all)
    end
end

如果我想搜索“Pizza”,我希望它与一个名为“Master Pizza Project”的项目匹配keyword1 => “MasterPizza”和keyword2 => “披萨”,我将如何重构上述代码?

另外,区分大小写是一个问题吗?

4 个答案:

答案 0 :(得分:0)

Ryan Bates还谈到了利用Sphinx进行全文搜索的另一个轨道广播。我强烈推荐这种方法,而不是从头做事:

http://railscasts.com/episodes/120-thinking-sphinx

答案 1 :(得分:0)

您需要将查询拆分为原子,将每个原子作为单独的查询运行,然后合并每个原子的结果。

此时事情变得相当复杂,你最好使用像Acts as Indexed这样的搜索库来处理这一切。

[披露]我是Acts as Indexed的作者。

答案 2 :(得分:0)

查看MetasearchMetawhere宝石。

答案 3 :(得分:0)

我不太了解你的q,但我希望这是有道理的:

def self.search(search)
    if search
     where('title LIKE ? OR keyword1 LIKE ? OR keyword2 LIKE ?',"%#{search}%", "%#{search}%","%#{search}%")
    # find(:all, :conditions => ['title LIKE ?', "%#{search}%"])
    else
      all
    end
  end