Cita:
Iniciado por zyxer
Por otro lado, el asunto de los LIKE's es muy importante para mí porque hay muchas canciones e intérpretes con nombres cortos (ejemplo de intérpretes: U2, QBO, JN3, SB4 [o Son by four, donde solo la palabra four sería encontrada] ...), es más, mira estos ejemplos:
1) U2 tiene una canción llamada ONE... ¿Que haríamos si a alguien le interesa buscarla? no podemos sencillamente ignorarlo...
2) Jesse y Joy tienen una canción que se llama mi sol, si el usuario busca mi sol jesse y joy está siendo muy específico pero solamente se buscaría la palabra jesse, trayendo como resultado TODAS las canciones de Jesse y Joy, pero también TODAS las de Jesse Stone, y en un orden impredecible (puede que habiendo sido tan específico, la canción que buscan salga los últimos puestos).
Por el otro lado tienes razón en que si buscamos LIKE %mi% AND LIKE %sol% podría ser peor porque traería ademas todas las canciones que incluyan la palabra SOLEDAD, SOLDADO, COMIDA, etc...
Ahora bien, ¿qué he hecho para solucionar esto? Antes de hacer la consulta MySQL, las palabras escritas por el usuario pasan por un script PHP que es quien da forma a la consulta final, añadiendo al MATCH... AGAINST... los LIKE's de de la siguiente manera:
Búsqueda del usuario: one u2
Consulta MySQL: SELECT todo_lo_necesario FROM las_tablas WHERE MATCH ("one u2") AGAINST (los_campos) OR (campo LIKE '%one %') OR (campo LIKE '% one%') OR (campo LIKE '% one %') OR (campo = 'one') OR (campo LIKE '% u2%') OR (campo LIKE 'u2 %') OR (campo LIKE '% u2 %') OR (campo = 'u2')
De esa manera traería aquellas consultas donde se incluyan las palabras exactas, se encuentren al final, al principio o en el medio de la oración, o bien, sean la única palabra (es decir, traería "one direction" o "one way", pero no traería "se pone bien"). Ahora el problema únicamente sería que no necesariamente las traería en orden.
PARA FINALIZAR: ¿Cual pienso yo que sería la solución correcta? Buscar la manera de que a mayor coincidencia de palabras cortas, la relevancia aumente, así "ONE de U2", estaría primero que las canciones de "ONE DIRECTION" o el resto de las canciones de "U2", por tener dos coincidencias, mientras las otras solo tienen una (también solucionaría lo del orden con el ejemplo de la canción Mi sol de Jesse y Joy). ¿Que piensas? ¿Se podría hacer algo así?
El método más adecuado para búsquedas de casos como el mencionado, surge de analizar cuál es el comportamiento habitual de las personas cuando buscan algo, tal como los ejemplos expuestos dicen.
Habitualmente las personas buscan las palabras que
empiezan aproximadamente con un texto determinado, y rara vez buscan uno que
termine con tales o cuales palabras.
Por otro lado, cuando se buscan textos intermedios, las personas ingresan palabras completas. Muy, pero muy rara vez, se ingresan partes de palabras.
Estos detalles no los estoy inventando. Si te observas a ti mismo, verás que ese es el modo habitual en que realizas tus propias búsquedas en Google, por ejemplo.
¿Qué implica esto para tu solución?
Bueno, simplemente que es mucho mejor hacer un
que hacer
¿Por qué?
Bueno, sencillamente porque al buscar lo que comience o termine con textos concretos, MySQL aplicará los índices que existan, mientras que cuando usas ambos comodines en el mismo LIKE, los descarta. Asi de sencillo.
¿Qué pasa con las palabras intermedias?
En ese caso debes tener en cuenta que cuando alguien busca palabras intermedias, normalmente busca o frases completas, o busca palabras de más de tres letras, y muy rara vez busca tres. Y para esos casos aplica usar indices FULLTEXT, si están disponibles.
Finalmente, como nota: Es posible usar LIKE '%palabra%', pero con ciertas restricciones funcionales:
- Nunca usarlo en campos TEXT, o con campos VARCHAR de más de 150 caracteres (o como máximo 255).
- Nunca usarlo contra tablas que contengan centenares de miles o millones de registros.
- Jamás usarlo cuando el texto a buscar contenga palabras completas, ya que para eso está el caso anterior.
Básicamente, podrías usarlo para la tabla de Autores, o la de Intérpretes, pero no para la de Canciones, si lo pretendes hacer en un campo que contenga la letra de las mismas.
¿Se entiende la idea?