多关键字数据库搜索

时间:2011-07-29 16:38:48

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

我目前正在我的模型中使用范围来在数据库中执行搜索。我可以堆叠这些范围,它将输出匹配所有参数的结果。

scope :search_between, lambda{|begin_date, end_date|
  where "sub.date BETWEEN ? AND ?", begin_date, end_date
}

我遇到的问题是整合关键字搜索,搜索整个数据库并输出包含关键字总和的结果。我想做这样的事情(显示为简单):

scope :keywords, lambda{|search|
  search.chomp.split(/,\s*/) do |item|
    where "date like ? or city like ? or state like ?", "%#{item}%" and
    where "date like ? or city like ? or state like ?", "%#{item}%" and
    where "date like ? or city like ? or state like ?", "%#{item}%"
  end
}

我目前正在使用这样的东西来处理搜索多个列:

scope :keywords, lambda{|search|
  search.chomp.split(/,\s*/) do |item|
    where(Sub.column_names.map {|cn| "#{cn} like ?" }.join("or "), "%#{item}%"]  Sub.column_names.size)).join(' AND ')
  end
} 

我的问题是我想在范围内做多个“where()”。是否可能,如果可能,怎么样?

2 个答案:

答案 0 :(得分:1)

只需将其转换为返回范围的方法:

def self.keywords(search)
  scope = self.scoped
  search.chomp.split(/,\s*/).each do |item|
    scope = scope.where(["date  like ? or 
                          city  like ? or 
                          state like ?", "%#{item}%","%#{item}%","%#{item}%"])
  end
  scope
end
缺点是您不能将关键字链接到其他范围,但您可以将其他范围与关键字链接起来。

答案 1 :(得分:0)

我认为使用数据库进行全文搜索会达到极限。

您是否考虑过使用SolrSphinx进行全文搜索?如果您想使用第三方服务,还有IndexTank。

对于solr,有一些rubygems可以帮助你:sunspotsolrsan(我是作者)

太阳黑子肯定更全功能,而solrsan是一个准系统层。