Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/02/2012, 15:10
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Encontrar con "LIKE" sin importar orden de las palabras

Hola luisdelbar:

A últimas fechas he venido observando que las preguntas con respecto a búsquedas de texto se han multiplicado, sin embargo no entiendo por qué la insistencia de utilizar LIKE en lugar de MATCH-AGAINST... en más de una ocasión se ha mencionado que hacer LIKE '%algo%' es completamente ineficiente, pues obliga al motor a hacer una búsqueda exhaustiva sobre la tabla... lo que afecta enormemente el rendimiento del servidor.

Creo que el problema es que no se han tomado el tiempo en experimentar las enormes ventajas que proporcionan las búsquedas de texto completo.

Luis, para tu ejemplo, no mencionas que son T1 y T2 pero puedo suponer que se trata de dos campos en tu tabla. quiero imaginar que en uno de ellos almacenas el título del libro y en otro el o los autores. Checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (
  2.     -> titulo VARCHAR(200),
  3.     -> autores VARCHAR(200),
  4.     -> FULLTEXT (titulo,autores)
  5.     -> ) ENGINE=MYISAM;
  6. Query OK, 0 rows affected (0.11 sec)
  7.  
  8. mysql> INSERT INTO tabla (titulo, autores) VALUES
  9.     -> ('Critical Thinking Introduction','Alec Fisher'),
  10.     -> ('otro libro','Fisher'),
  11.     -> ('continuación libro','Alec'),
  12.     -> ('otro libro más','otro autor'),
  13.     -> ('Critical Thinking "Introduction"','Alec "el escritor" Fisher'),
  14.     -> ('Alec Fisher', 'Critical Thinking Introduction');
  15. Query OK, 6 rows affected (0.00 sec)
  16. Records: 6  Duplicates: 0  Warnings: 0
  17.  
  18. mysql> SELECT * FROM tabla;
  19. +----+----------------------------------+--------------------------------+
  20. | id | titulo                           | autores                        |
  21. +----+----------------------------------+--------------------------------+
  22. |  1 | Critical Thinking Introduction   | Alec Fisher                    |
  23. |  2 | otro libro                       | Fisher                         |
  24. |  3 | continuación libro               | Alec                           |
  25. |  4 | otro libro más                   | otro autor                     |
  26. |  5 | Critical Thinking "Introduction" | Alec "el escritor" Fisher      |
  27. |  6 | Alec Fisher                      | Critical Thinking Introduction |
  28. +----+----------------------------------+--------------------------------+
  29. 6 rows in set (0.00 sec)
  30.  
  31. mysql> SELECT * FROM tabla
  32.     -> WHERE MATCH (titulo, autores) AGAINST ('Alec Fisher' IN BOOLEAN MODE);
  33. +----+----------------------------------+--------------------------------+
  34. | id | titulo                           | autores                        |
  35. +----+----------------------------------+--------------------------------+
  36. |  1 | Critical Thinking Introduction   | Alec Fisher                    |
  37. |  2 | otro libro                       | Fisher                         |
  38. |  3 | continuación libro               | Alec                           |
  39. |  5 | Critical Thinking "Introduction" | Alec "el escritor" Fisher      |
  40. |  6 | Alec Fisher                      | Critical Thinking Introduction |
  41. +----+----------------------------------+--------------------------------+
  42. 5 rows in set (0.00 sec)
  43.  
  44. mysql> SELECT * FROM tabla
  45.     -> WHERE MATCH (titulo, autores) AGAINST ('Fisher Alec' IN BOOLEAN MODE);
  46. +----+----------------------------------+--------------------------------+
  47. | id | titulo                           | autores                        |
  48. +----+----------------------------------+--------------------------------+
  49. |  1 | Critical Thinking Introduction   | Alec Fisher                    |
  50. |  2 | otro libro                       | Fisher                         |
  51. |  3 | continuación libro               | Alec                           |
  52. |  5 | Critical Thinking "Introduction" | Alec "el escritor" Fisher      |
  53. |  6 | Alec Fisher                      | Critical Thinking Introduction |
  54. +----+----------------------------------+--------------------------------+
  55. 5 rows in set (0.00 sec)

Observa que estoy utilizando el tipo de búsqueda IN BOOLEAN MODE. Independientemente del orden en que ponga el texto a buscar me regresa los registros que contienen al menos una de las palabras a buscar.

Recuerda (o conoce si es que no lo sabes) que aquí no se ordenan registros automáticamente para ordenarlos por relevancia decrecente, aunque podrías poner algo como esto:

Código Python:
Ver original
  1. ORDER BY
  2. MATCH (titulo, autores) AGAINST ('Fisher Alec' IN BOOLEAN MODE) DESC

La expresión "equivalente" para hacer esto mismo con LIKE sería:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE
  2.     -> titulo LIKE '%Fisher%' OR
  3.     -> autores LIKE '%Fisher%' OR
  4.     -> titulo LIKE '%Alec%' OR
  5.     -> autores LIKE '%Alec%';
  6. +----+----------------------------------+--------------------------------+
  7. | id | titulo                           | autores                        |
  8. +----+----------------------------------+--------------------------------+
  9. |  1 | Critical Thinking Introduction   | Alec Fisher                    |
  10. |  2 | otro libro                       | Fisher                         |
  11. |  3 | continuación libro               | Alec                           |
  12. |  5 | Critical Thinking "Introduction" | Alec "el escritor" Fisher      |
  13. |  6 | Alec Fisher                      | Critical Thinking Introduction |
  14. +----+----------------------------------+--------------------------------+
  15. 5 rows in set (0.00 sec)

Pero aquí no hay modo de saber la relevancia de los resultados obtenidos.

Además, puedes utilizar muchos operadores para las búsquedas booleanas (+, -, <, >, ~, *, (, ), etc.) para hacer aun más exactas tus búsquedas, te recomiendo que le des un vistazo a la documentación oficial para ver todas las ventajas que obtienes al utilizar esto en lugar del LIKE.

http://dev.mysql.com/doc/refman/5.0/...xt-search.html

Saludos
Leo.