ค้นหาฐานข้อมูลคำหลักหลายคำ

ขณะนี้ฉันกำลังใช้ขอบเขตในโมเดลของฉันเพื่อทำการค้นหาภายในฐานข้อมูล ฉันสามารถซ้อนขอบเขตเหล่านี้ได้ และมันจะให้ผลลัพธ์ที่ตรงกับพารามิเตอร์ทั้งหมด

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()" หลายรายการในขอบเขต เป็นไปได้หรือไม่ และถ้าเป็นเช่นนั้น ทำอย่างไร?


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