2010-07-21 40 views

Trả lời

8

Sql like có thể rất không hiệu quả trong một số trường hợp, ví dụ: in many cases in MySQL. Tôi khuyên bạn nên sử dụng một số phần mềm lập chỉ mục toàn văn như Sphinx, Xapian hoặc Lucene.

+0

do đó không có cách nào trong Active Record để tìm kiếm cho một chuỗi trong mỗi bảng và các cột của chúng? –

+0

Tìm kiếm trong tất cả các bảng có thể được thực hiện với truy vấn thô như sau: 'SELECT 'table1' AS table_name, id FROM table1 WHERE c1 LIKE"% text% "HOẶC c2 LIKE"% text% "UNION ALL SELECT 'table2' AS table_name, id FROM table2 WHERE c3 LIKE "% text%" ', nhưng tôi sẽ không làm điều đó, nó hoàn toàn khó xử. Nếu bạn đang sử dụng MySQL, nó có một số khả năng lập chỉ mục toàn văn bản - http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - nhưng tôi không biết nó tốt như thế nào. Tôi không biết về hỗ trợ tìm kiếm toàn văn bản trong các DB quan hệ khác. Sắp xếp lại - AR sẽ không giúp bạn, sử dụng phần mềm lập chỉ mục toàn văn nếu bạn có thể. – skalee

+0

Chỉ tìm thấy một giây trước, nó có thể giúp bạn http://snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/Base.html – skalee

11
Model.find(:all, :conditions => ['name LIKE ?', "%#{tag}%"]) 

đâu tag là biến của bạn có chứa các chuỗi

theo bình luận @bjg: -

Hoặc trong Rails 3 bạn muốn viết những dòng này như

Model.where(["name LIKE :tag", {:tag => tag}]) 

bằng cách sử dụng mới cú pháp tìm kiếm -

+2

Hoặc trong Rails 3 bạn sẽ viết điều này là 'Model.where ([" LIKE: thẻ ", {: tag => tag}])' bằng cách sử dụng cú pháp tìm kiếm mới – bjg

+0

nhưng làm thế nào để tôi nói với RoR3 để tìm kiếm trong TẤT CẢ các cột cho mô hình đó không chỉ trong cột "tên"? –

+0

@never_had_a_name kiểm tra công cụ tìm kiếm nhân sư cho điều đó. Kiểm tra tư duy nhân sư http://railscasts.com/episodes/120-thinking-sphinx –

3

bạn cũng có thể sử dụng phương pháp 'đối sánh' của Arel:

Model.match(:name => tag) 

nếu bạn muốn tìm kiếm trong tất cả các cột, thì bạn nên viết thêm một số mã.

+0

Không làm việc cho tôi. – squixy

+0

Không làm việc cho tôi. Sử dụng 'arel', tôi sẽ viết truy vấn như sau:' Model.where (Model.arel_table [: name] .matches ("% # {query_string}%")) ' – tsikov

2

Tôi nghĩ acts_as_ferret plugin sẽ được hoàn hảo cho nhu cầu của bạn, plugin này cho phép bạn cấu hình chỉ số dễ dàng rất mát mẻ như

ActsAsFerret::define_index('my_index', 
         :models => { 
          SomeModel => { 
          :fields => { 
           :name => { :boost => 4, :store => :yes, :via => :ferret_title }, 
           :foo => { :store => :no, :index => :untokenized }, 
           :baz => { :store => :yes, :via => :ferret_content } 
          } 
          } 
         }) 

Tất cả các chỉ số acts_as_ferret được cấu hình trong một tập tin duy nhất, RAILS_ROOT/config/aaf.rb

+0

Không chỉ Ferret. Nhân sư tư duy của Sphinx cũng tích hợp với AR độc đáo. Nói chung, sử dụng phần mềm lập chỉ mục toàn văn là một ý tưởng hay. – skalee

+0

Loại đau của Ferret ở phía sau. Đó là chậm, nó dễ bị chỉ mục tham nhũng, và tôi không có gì ngoài vấn đề với nó. suy nghĩ-nhân sư là con đường để đi. –

2

Nếu bạn đang triển khai để Heroku hoặc không nhớ thả db thuyết bất khả tri, postgres đã hỗ trợ tìm kiếm văn bản đầy đủ. Bạn sẽ không cần phải chạy một dịch vụ bổ sung. Bên cạnh đó PG là cơ sở dữ liệu hệ điều hành tốt nhất. http://tenderlove.github.com/texticle/

Các vấn đề liên quan