【问题标题】:Writing a search method that matches loosely编写松散匹配的搜索方法
【发布时间】:2011-09-05 00:59:01
【问题描述】:

我刚刚观看了关于 simple search form 的 railscast,我想在我的应用程序中做类似的事情,但我不想只找到完全匹配的结果。

我有一个名为 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”的项目匹配关键字1 =>“MasterPizza”和关键字2 =>“Pizza”,我将如何重构上述代码?

另外,区分大小写是否有问题?

【问题讨论】:

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


    【解决方案1】:

    还有另一个 Railscast,Ryan Bates 谈到利用 Sphinx 进行全文搜索。我强烈推荐这种方法,而不是从头开始:

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

    【讨论】:

      【解决方案2】:

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

      此时事情变得相当复杂,您最好使用诸如 Acts as Indexed 之类的搜索库,它会为您处理所有这些问题。

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

      【讨论】:

        【解决方案3】:

        查看 MetasearchMetawhere 宝石。

        【讨论】:

          【解决方案4】:

          我不太明白你的问题,但我希望这是有道理的:

          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    
          

          【讨论】:

            猜你喜欢
            • 2012-03-07
            • 2016-06-02
            • 1970-01-01
            • 2019-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-08
            • 1970-01-01
            相关资源
            最近更新 更多