Поиск по базе данных по нескольким ключевым словам

В настоящее время я использую области в своей модели для выполнения поиска в базе данных. Я могу сложить эти области, и он выведет результаты, соответствующие всем параметрам.

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
} 

Моя проблема в том, что я хочу сделать несколько "где()" в области видимости. Возможно ли это и если да, то как?


person sublimeike    schedule 29.07.2011    source источник


Ответы (2)


Просто превратите его в метод, который возвращает область:

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
Недостаток в том, что вы не можете связать ключевые слова с другими областями, но вы можете связать другие области с ключевыми словами.

person klochner    schedule 29.07.2011

Я думаю, что вы достигнете предела, используя базу данных для полнотекстового поиска.

Вы изучали использование Solr или Sphinx для полнотекстового поиска? Также есть IndexTank, если вы хотите использовать сторонний сервис.

Для solr есть rubygems, которые помогут вам: sunspot, solrsan(я автор)

Sunspot определенно более полнофункциональный, а solrsan — это базовый слой.

person tommy chheng    schedule 29.07.2011
comment
Честно говоря, я пытался сделать что-то, что не требовало бы от меня установки чего-либо на сервере. - person sublimeike; 29.07.2011