2009-06-24 16 views
8

Estoy tratando de implementar una búsqueda básica de texto completo con MySQL.Búsqueda de texto completo de MySQL en Ruby on Rails

escribí esta migración:


def self.up 
    execute 'ALTER TABLE photos ENGINE = MyISAM' 
    execute 'CREATE FULLTEXT INDEX fulltext_photos ON photos (place, info)' 
end 

def self.down 
    execute 'ALTER TABLE photos ENGINE = InnoDB' 
    execute 'DROP INDEX fulltext_photos ON photos' 
end 

Y es mi modelo aquí:


def self.search(*args) 
    options = args.extract_options! 
    find_by_sql [ "SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?)", options[:query] ] 
end 

El problema es que este código siempre devuelve una matriz vacía.

Por ejemplo:

% Photo.find(:first) 
=> Photo id: 1, place: "Baceno", info: "Era immerso in erba alta." ... 

% Photo.search(:all, :query => 'baceno') 
=> []
+0

Esta secuencia de comandos de migración funciona muy bien, pero recuerde revertir la orden en el método self.down, el índice debe eliminarse antes de alterar la tabla de nuevo a InnoDB, de lo contrario, obtendrá un error. –

Respuesta

9

I creó un proyecto (Rails 2.3.2, Ruby 1.9.1 MySQL 5.0) para emular esto. Con un registro en la base de datos, obtuve los mismos resultados que tú. Cuando agregué más registros, el comando Photo.search encontró el registro.

Esto podría deberse a que "las palabras que están presentes en el 50% o más de las filas se consideran comunes y no coinciden". Ref.

El umbral del 50% no se aplica en modo binario. Ref.

en modo binario pertenece dentro de los paréntesis: CONTRA ('Baceno' EN MODO BOOLEANA)

+0

Perfecto ... ¡todo está claro ahora! – collimarco

1

En mi prueba (solo en MySQL, no en los carriles) cuando agrego la opción en el modo BOOLEANA a la instrucción SELECT , parece devolver filas.

SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?) IN BOOLEAN MODE 

También recomendaría utilizar un producto de búsqueda independiente como Solr o Sphinx para buscar.

2

El siguiente código se ejecuta para mi página web y da el resultado correcto en ruby ​​on rails.

Adverse.find(:all, :conditions => ["match(related_company,client_name) against (? IN BOOLEAN MODE)",@chk]) 
Cuestiones relacionadas