2010-07-21 12 views

Respuesta

8

Sql like puede ser muy ineficiente en algunos casos, por ejemplo in many cases in MySQL. Recomiendo usar algún software de indexación de texto completo como Sphinx, Xapian o Lucene.

+0

por lo que no hay forma en Active Record para buscar por una cadena en todas las tablas y sus columnas? –

+0

La búsqueda en todas las tablas podría realizarse con una consulta sin formato como esta: 'SELECT 'table1' AS table_name, id FROM table1 WHERE c1 LIKE"% text% "O c2 LIKE"% text% "UNION ALL SELECT 'table2' AS table_name, id FROM table2 DONDE c3 ME GUSTA "% text%" ', pero no haría eso, es totalmente incómodo. Si está utilizando MySQL, tiene algunas capacidades de indexación de texto completo - http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - pero no sé qué tan bueno es. No sé sobre el soporte de búsqueda de texto completo en otras DB relacionales. Recapitulando: AR no ayudará, use software de indexación de texto completo si puede. – skalee

+0

Acabo de encontrarlo hace un momento, puede ayudarte http://snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/Base.html – skalee

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

Cuando la etiqueta es la variable que contiene la cadena

según @bjg comentario: -

O en Rails 3 que escribiría esto como

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

utilizando el nuevo sintaxis del buscador -

+2

O en Rails 3 que iba a escribir esto como 'Model.where ([ "nombre como: la etiqueta", {: tag => tag}])' usando la nueva sintaxis buscador – bjg

+0

pero ¿cómo le digo RoR3 buscar en TODAS las columnas para ese modelo no solo en la columna "nombre"? –

+0

@never_had_a_name revisa el motor de búsqueda de sphinx para eso. Compruebe el pensamiento sphinx http://railscasts.com/episodes/120-thinking-sphinx –

3

también se puede usar el método de 'coincidencia' de Arel:

Model.match(:name => tag) 

si desea buscar en todas las columnas, entonces debe escribir un código adicional.

+0

No funciona para mí. – squixy

+0

No funciona para mí tampoco. Usando 'arel', escribiría la consulta de la siguiente manera:' Model.where (Model.arel_table [: name] .matches ("% # {query_string}%")) ' – tsikov

2

Creo acts_as_ferret complemento sería perfecto para sus necesidades, este plugin permite configurar fácilmente índices muy interesantes como

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 } 
          } 
          } 
         }) 

Todos los índices acts_as_ferret se configuran en un solo archivo, RAILS_ROOT/config/aaf.rb

+0

No solo Ferret. La esfinge del pensamiento de Sphinx también se integra con AR muy bien. En general, usar software de indexación de texto completo es una buena idea. – skalee

+0

Hurón es una especie de dolor en la parte trasera. Es lento, es propenso a indexar la corrupción y no tuve más problemas que eso. pensamiento-esfinge es el camino a seguir. –

2

Si va a distribuir a heroku o no le importa dejar caer el agnosticismo db, Postgres tiene apoyo en la búsqueda de texto completo. No necesitarás ejecutar un servicio adicional. Además PG es la mejor base de datos del sistema operativo. http://tenderlove.github.com/texticle/

Cuestiones relacionadas