Pencarian basis data beberapa kata kunci

Saat ini saya menggunakan cakupan dalam model saya untuk melakukan pencarian dalam database. Saya dapat menumpuk cakupan ini dan akan menampilkan hasil yang cocok dengan semua parameter.

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

Masalah yang saya alami adalah mengintegrasikan pencarian kata kunci yang akan mencari seluruh database dan menampilkan hasil yang berisi jumlah kata kunci. Saya ingin melakukan sesuatu seperti ini (ditampilkan untuk kesederhanaan):

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
}

Saat ini saya menggunakan sesuatu seperti ini untuk menangani pencarian beberapa kolom:

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
} 

Masalah saya adalah saya ingin melakukan beberapa "di mana ()" dalam cakupannya. Apakah mungkin dan jika ya, bagaimana caranya?


person sublimeike    schedule 29.07.2011    source sumber


Jawaban (2)


Ubah saja menjadi metode yang mengembalikan cakupan:

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
Kekurangannya adalah Anda tidak dapat merangkai kata kunci dari cakupan lain, namun Anda dapat merangkai cakupan lain dari kata kunci.

person klochner    schedule 29.07.2011

Saya rasa Anda akan mencapai batas penggunaan database untuk pencarian teks lengkap.

Sudahkah Anda mempertimbangkan untuk menggunakan Solr atau Sphinx untuk penelusuran teks lengkap Anda? Ada juga IndexTank jika Anda ingin menggunakan layanan pihak ketiga.

Sebagai gantinya, ada rubygem yang tersedia untuk membantu Anda: sunspot, solrsan(saya penulisnya)

Sunspot pastinya lebih berfitur lengkap dan solrsan adalah lapisan barebone.

person tommy chheng    schedule 29.07.2011
comment
Sejujurnya, saya mencoba melakukan sesuatu yang tidak mengharuskan saya menginstal apa pun di server - person sublimeike; 29.07.2011