Написание метода поиска, который слабо соответствует

#ruby-on-rails #ruby-on-rails-3 #search #railscasts

#ruby-on-rails #ruby-on-rails-3 #Поиск #железнодорожные трансляции

Вопрос:

Я только что посмотрел 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» с keyword1 => «MasterPizza» и keyword2 => «Pizza», как бы я рефакторил приведенный выше код?

Кроме того, является ли проблема с чувствительностью к регистру?

Ответ №1:

Есть еще один railscast, где Райан Бейтс рассказывает об использовании Sphinx для полнотекстового поиска. Я бы настоятельно рекомендовал такой подход вместо того, чтобы делать что-то с нуля :

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

Ответ №2:

Вам нужно было бы разбить запрос на атомы, запустить каждый атом как отдельный запрос, а затем объединить результаты из каждого атома.

На данный момент все становится довольно сложным, вам было бы лучше использовать библиотеку поиска, такую как Acts as Indexed, которая позаботится обо всем этом за вас.

[Раскрытие] Я автор Acts as Indexed.

Ответ №3:

Ознакомьтесь с камнями метапоиска и Metawhere.

Ответ №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