MATCH… AGAINST. Yo de caprichudo otra vez.
Sigo con lo de las búsquedas, no logro resolver eso…No me convence utilizar MATCH…AGAINST, tiene dos o tres detalles que me asustaron, muestra mucho resultado basura… Presencie ese reducido detalle en los resultados arrojados jeje (solo eso).
[sql]SELECT * FROM entradas WHERE MATCH(titulo,contenido) AGAINST('".$busqueda."')[/sql]Me comentaban que los resultados que descendían de esta consulta eran similares al comportamiento de un buscador, pero mmm… a mi me pareció todo lo contrario.
Si quisiera que la búsqueda “can” emparejara con “canción”, no empareja. No me convence match…against. ¡Que alguien me desmienta!
Me desmiento yo solito, si funciona. :-)
Puff, creo que MATCH…AGAINST no es lo que necesito. Incluso ahora que llevo ya meses y meses analizando resultados recuerdo que mi implementación que analizaba todo el arreglo devolvía resultados más exactos y en menor cantidad, y match-against… mmm… noo!... Me devuelve casi la totalidad de registros (Me quedo así de ¬¬ huuy si, como si toda la tabla coincidiera con mi búsqueda ¬¬’ jiji ^^ ¡Que estupido! )
No se si se pueda, pero... Se me ocurre que pudiera existir la remota manera de crear funciones que se ejecuten antes de darle salida al intérprete de php (oséa de lado del MySQL) ¿Existe eso? No me hagan mucho caso, me falta un tornillo :-S
La idea aquí es mejorar la búsqueda lo más que se pueda, llevo meses con el capricho de tener un algoritmo de búsqueda o comparación más completo y *ojo* (lo mas importante) en local.
Si alguien ya ha tocado el tema de las búsquedas y las ha trabajado obteniendo buenos resultados, estoy abierto a todo tipo de sugerencia o ayuda. Se supone que la búsqueda debe ser lo mas inteligente posible, pero no se me ocurre como marcar relevancias sin tanto rollo, o coincidencias con mayor porcentaje de acercamiento.
No se por que, pero, se me ocurre que muy remotamente en la Web (especialmente en sourceforge.net) pueda existir alguien que halla hecho algún software opensource para realizar búsquedas…
El archivo de búsqueda ha sufrido un sin fin de modificaciones, y hasta re-implementación desde cero. No he llevado un historial, pero les pongo la versión mas reciente para que me la critiquen con todo lo que puedan.
Aquí el código del buscador.
--
pecesama
2006-08-24 11:32:49
si te entendi bien lo que buscas se llaman <strong>stored procedures</strong> para lo de:
<blockquote>Se me ocurre que pudiera existir la remota manera de crear funciones que se ejecuten antes de darle salida al intérprete de php (oséa de lado del MySQL) ¿Existe eso?</blockquote>
Victor
2006-08-24 11:40:18
Tssssssss como no se les ocurrio hacer eso en hace tiempo, sólo está desde la version 5. Gracias! :)
Name (required)
2007-10-02 10:15:02
http://www.desarrolloweb.com/articulos/2087.php
yony montana
2011-09-25 12:39:52
HOLA A TODOS. COMO PUEDO SOLUCIONAR MI PROBLEMA
TENGO UNA CONSULTA QUE ME FUNCIONA BIEN, PERO EL DETALLE ES DEMASIADO LENTO EN 2 MILLONES DE REGISTROS.
SELECT PAC_APATERNO,PAC_AMATERNO,PAC_NOMBRES FROM pacientes
where concat(PAC_APATERNO,' ',PAC_AMATERNO,' ',PAC_NOMBRES) LIKE '%LEONARDO LEON%' order by PAC_APATERNO,PAC_AMATERNO,PAC_NOMBRES;
Y TENGO OTRA QUE FUNCIONA MEJOR USANDO MATCH Y AGAINST , PERO ORDENA PESIMO
SELECT PAC_APATERNO, PAC_AMATERNO, PAC_NOMBRES,
MATCH (PAC_APATERNO, PAC_AMATERNO, PAC_NOMBRES) AGAINST ('LEONARDO LEON') AS score
FROM pacientes
WHERE MATCH (PAC_APATERNO, PAC_AMATERNO, PAC_NOMBRES)AGAINST ('LEONARDO LEON')
ORDER BY score DESC LIMIT 15 ;
RESULTADO USANDO MI PROPIA CONSULTA :
PAC_APATERNO PAC_AMATERNO PAC_NOMBRES
LEONARDO LEON EDSON GONZALO
LEONARDO LEON INES NELLY
LEONARDO LEON JEREMY DAVID
LEONARDO LEON JOSE
LEONARDO LEON MIGUEL ANGEL
LEONARDO LEON NATHALY JOSELINE
LEONARDO LEON PABLO
LEONARDO LEON VICTOR JOSUE
LEONARDO LEONARDO CLAUDIA SOFIA
LEONARDO LEONARDO LEONIDAS
LEONARDO LEONARDO VALERIA
RESULTADO USANDO MATCH Y AGAINST:
PAC_APATERNO PAC_AMATERNO PAC_NOMBRES score
LEONARDO LEON PABLO 8,914355405
LEONARDO LEON JOSE 8,914355405
LEONARDO LEON NATHALY JOSELINE 8,81634848
VILLAIZAN LEON ALEXANDER LEONARDO 8,81634848
LEONARDO LEON EDSON GONZALO 8,81634848
LEONARDO LEON VICTOR JOSUE 8,81634848
LEONARDO LEON INES NELLY 8,81634848
LEONARDO LEON JEREMY DAVID 8,81634848
LEONARDO LEON MIGUEL ANGEL 8,81634848
LEONARDO LEONARDO CLAUDIA SOFIA 6,664089587
LEONARDO LEONARDO LEONIDAS 6,160854282
LEONARDO LEONARDO VALERIA 6,160854282
LEON LEON MARIA ISABEL 5,596442501
LEON LEON MIRIAM CONSUELO 5,596442501
LEON LEON JHONY RONALDO 5,596442501
QUIERO OPTIMIZAR MI CONSULTA QUE SEA RAPIDO Y EN FORMA ORDENADA ALFABETICAMENTE
GRACIS POR SU APOYO
Victor De la Rocha
2011-09-26 09:52:12
yony montana, prueba creando índices, y pruebas tu consulta y nos comentas el resultado:
ALTER TABLE pacientes ADD INDEX ('PAC_APATERNO');
ALTER TABLE pacientes ADD INDEX ('PAC_AMATERNO');
ALTER TABLE pacientes ADD INDEX ('PAC_NOMBRES');
http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/
yony montana
2011-09-28 12:59:13
hola Victor De la Rocha, ya cree los indices pero no pasa nada ??? sigue igual
la consulta tendria que ordenar por apellido (paterno, materno, nombre), recuerda que mi tabla tiene 2 millones de registros.
... porfa alguen puede ayudarme ....
Victor De la Rocha
2011-09-28 13:20:43
yony montana y si en lugar de hacer esto:
concat(PAC_APATERNO,' ',PAC_AMATERNO,' ',PAC_NOMBRES) LIKE '%LEONARDO LEON%'
evitas hacer el concat, creo que te ahorrarías tiempo en procesamiento, y en conjunto con los índices que agregaste, hacer algo así:
PAC_APATERNO LIKE '%LEONARDO LEON%'
OR PAC_AMATERNO LIKE '%LEONARDO LEON%'
OR PAC_NOMBRES LIKE '%LEONARDO LEON%'
Pruebas y nos cuentas que pasó...