PDA

Ver la Versión Completa : problema con consulta sql con Match Against


kdemia
27-06-2012, 08:47:19
Que tal gente, tengo un problema. Estoy desarrollando una aplicacion de gestion de productos con delphi 2010 y mysql, conectado mediante ADO. De cada producto tengo, entre muchos campos, uno que se llama "descripcion" que es de tipo TEXT donde guardo "tags" de cada producto para poder realizar una busqueda avanzada, por ejemplo de un televisor un tag posible puede ser 32" (pulgadas), entonces en la busqueda avanzada enumero X cantidad de tags y me busca aquellos productos que en su descripcion contengan alguno de los tag enumerados. Por ejemplo tengo un Televisor que tiene de tags 32" - HDMI - HD (un tag abajo del otro) y otro Televisor con que tiene 32" USB HD, bien, ahora yo en delphi tengo un Memo donde pongo 32" y HD, nuevamente separados por un enter, entonces para realizar la busqueda tengo el siguiente codigo
for i := 0 to descripcion.Lines.Count - 1 do
if i = 0 then
sql:= sql+'and ((MATCH(p.descripcion) AGAINST ("'+
descripcion.Lines[i]+'"))'
else
sql:= sql+'or (MATCH(p.descripcion) AGAINST ("'+
descripcion.Lines[i]+'"))';
if FBusquedaAvanzada.descripcion.Lines.Count > 0 then
sql:= sql+')';

Aclaro que antes hay un "AND" porque hay varias cosas atras.

Bien el problema es que me tira la siguiente excepcion:

Project Project1.exe raised exception class EOleException with message '[MySQL][ODBC 5.1 Driver][mysqld-5.5.8-log]The used table type doesn't support FULLTEXT indexes'.

y luego su correspondiente error:

[MySQL][ODBC 5.1 Driver][mysqld-5.5.8-log]The used table type doesn't support FULLTEXT indexes.

Como puedo resolverlo? (se que es por culpa del MATCH AGAINST pero nose como resolverlo)

Saludos y espero haber sido claro. Gracias!

roman
27-06-2012, 17:20:45
Bueno, el mensaje de error es muy claro. La función Match() sirve para hacer búsquedas de "texto completo" y para ello tu tabla debe tener un índice de texto completo. Pero sólo las tablas de tipo MyIsam soportan este tipo de índices, por lo que si estás usando tablas InnoDb, tendrás que hacer la búsqueda de otra forma.

// Saludos

kdemia
27-06-2012, 18:10:38
Gracias roman por responder. Me doy cuenta que soy muy ignorante en este tema, a que se refiere con texto completo? en el caso que no lo pueda resolver de esta manera de que otra manera puedo resolverlo? aplicando MySQL y Delphi con el componente ADO
Gracias!

roman
27-06-2012, 18:45:36
En lugar de Match() puedes usar el operador like con %:


select ... from ...
where
... and
(
p.descripcion like '%32 "%' or
p.descripcion like '%HD%' or
...
)


// Saludos

kdemia
27-06-2012, 19:19:34
y pero con el operador LIKE y los comodines si yo pusiera H me lo encontraria ya uqe H es parte de HD lo mismo si pusiera 32 me encontraria el 32" :/, hay alguna manera de crear algun procedimiento almacenado que contenga ese tipo de busqueda? yo encontre este articulo (http://matubaum.wordpress.com/2007/10/11/buscador-con-mysql-utilizando-tablas-innodb/) donde la persona hace una funcion almacenada, pero me tira 10 millones de errores cuando ejecuto ese sql

kdemia
27-06-2012, 19:32:21
Estuve leyendo y aprendi bastante jaja. Ya esta cambie el motor de la tabla productos a MyISAM y cree el indice FULLTEXT y funciono perfecto, MUCHISIMAS GRACIAS :D