fulltext - mysql search
MySQL FULLTEXT no funciona (2)
Añadir más datos. Por defecto, MySQL ignorará cualquier palabra que se encuentre en el 50% o más de las filas de la tabla, ya que considera que sería una palabra de "ruido".
Con muy pocas filas en una tabla, es común alcanzar este límite del 50% a menudo (es decir, si tiene dos filas, ¡cada palabra está en al menos el 50% de las filas!).
Estoy intentando agregar soporte de búsqueda para mi aplicación web PHP usando los índices FULLTEXT de MySQL.
Creé una tabla de prueba (usando el tipo MyISAM, con un solo campo de texto a
) e ingresé algunos datos de muestra. Ahora si tengo razón, la siguiente consulta debería devolver ambas filas:
SELECT * FROM test WHERE MATCH(a) AGAINST(''databases'')
Sin embargo, no devuelve ninguno. He investigado un poco y estoy haciendo todo bien hasta donde puedo decir: la tabla es una tabla MyISAM, los índices FULLTEXT están establecidos. He intentado ejecutar la consulta desde el indicador y desde phpMyAdmin, sin suerte. ¿Me estoy perdiendo algo crucial?
ACTUALIZACIÓN: Ok, mientras que la solución de Cody funcionó en mi caso de prueba, no parece funcionar en mi tabla real:
CREATE TABLE IF NOT EXISTS `uploads` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`size` int(11) NOT NULL,
`type` text NOT NULL,
`alias` text NOT NULL,
`md5sum` text NOT NULL,
`uploaded` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
Y los datos que estoy usando:
INSERT INTO `uploads` (`id`, `name`, `size`, `type`, `alias`, `md5sum`, `uploaded`) VALUES
(1, ''04 Sickman.mp3'', 5261182, ''audio/mp3'', ''1'', ''df2eb6a360fbfa8e0c9893aadc2289de'', ''2009-07-14 16:08:02''),
(2, ''07 Dirt.mp3'', 5056435, ''audio/mp3'', ''2'', ''edcb873a75c94b5d0368681e4bd9ca41'', ''2009-07-14 16:08:08''),
(3, ''header_bg2.png'', 16765, ''image/png'', ''3'', ''5bc5cb5c45c7fa329dc881a8476a2af6'', ''2009-07-14 16:08:30''),
(4, ''page_top_right2.png'', 5299, ''image/png'', ''4'', ''53ea39f826b7c7aeba11060c0d8f4e81'', ''2009-07-14 16:08:37''),
(5, ''todo.txt'', 392, ''text/plain'', ''5'', ''7ee46db77d1b98b145c9a95444d8dc67'', ''2009-07-14 16:08:46'');
La consulta que estoy ejecutando ahora es:
SELECT * FROM `uploads` WHERE MATCH(name) AGAINST (''header'' IN BOOLEAN MODE)
Lo que debería devolver la fila 3, header_bg2.png. En su lugar, obtengo otro conjunto de resultados vacío. Mis opciones para la búsqueda booleana son las siguientes:
mysql> show variables like ''ft_%'';
+--------------------------+----------------+
| Variable_name | Value |
+--------------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
| ft_max_word_len | 84 |
| ft_min_word_len | 4 |
| ft_query_expansion_limit | 20 |
| ft_stopword_file | (built-in) |
+--------------------------+----------------+
5 rows in set (0.02 sec)
"header" está dentro de las restricciones de longitud de palabra y dudo que sea una palabra de parada (no estoy seguro de cómo obtener la lista). ¿Algunas ideas?
Hay dos modos para la búsqueda de texto completo en MySQL: modo de lenguaje natural y modo booleano. Una restricción del modo de lenguaje natural es "... las palabras que están presentes en el 50% o más de las filas se consideran comunes y no coinciden. Las búsquedas de texto completo son búsquedas en lenguaje natural si no se proporciona un modificador". Y el lenguaje natural es el modo por defecto. Esto se documenta en los documentos de texto completo:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Si cambia su consulta para usar el modo booleano:
SELECT * FROM test WHERE MATCH(a) AGAINST(''databases'' IN BOOLEAN MODE)
Luego se devuelven las dos filas.
El modo booleano tiene sus propias restricciones, una común es que no devuelve sus filas en orden de relevancia. En general, ofrece más funciones y flexibilidad que el modo de lenguaje natural, por lo que probablemente terminará usándolo.
Si su aplicación se basará en gran medida en la búsqueda de texto completo, es posible que desee considerar paquetes más completos, como Lucene/Solr o Sphinx