Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Búsquedas por texto

Estas en el tema de Búsquedas por texto en el foro de Mysql en Foros del Web. Hola a tod@s! Tengo una base de datos de "peliculas" y quiero que el usuario pueda buscar por título... ¿Que me recomiendan? Usar "LIKE", "MATCH ...
  #1 (permalink)  
Antiguo 30/12/2014, 09:54
Avatar de fbedia  
Fecha de Ingreso: julio-2010
Mensajes: 159
Antigüedad: 13 años, 9 meses
Puntos: 8
Búsquedas por texto

Hola a tod@s!
Tengo una base de datos de "peliculas" y quiero que el usuario pueda buscar por título...

¿Que me recomiendan? Usar "LIKE", "MATCH () AGAINST ()"...?

Por lo que tengo entendido, es mejor MATCH AGAINST... pero no se como hacer la query correctamente. Si usar IN BOOLEAN MODE o WITH QUERY EXPANSION... así como el uso de algunos operadores + - * etc...

Por ejemplo, si quiero buscar la pelicula "El señor de los anillos":

Código MySQL:
Ver original
  1. SELECT titulo FROM videos WHERE MATCH(titulo) AGAINST ('anillo')
Esta consulta no me devuelve resultados... por lo que no me vale

Código MySQL:
Ver original
  1. SELECT titulo FROM videos WHERE MATCH(titulo) AGAINST ('anillos')
Esta si me devuelve bien la pelicula

Otro ejemplo, es que para buscar la pelicula "VHS":
Código MySQL:
Ver original
  1. SELECT titulo FROM videos WHERE MATCH(titulo) AGAINST ('VHS')
No me devuelve resultados, ya que solo son 3 caracteres y tiene que ser a partir de 4

¿Me pueden ayudar con la Query?
Me gustaria por ejemplo que con las siguientes busquedas devolviese la pelicula del Señor de los anillos:
- anillo
- señor de los
- señor de los anillos

NOTAS:
La tabla es MyISAM y la columna "titulo" la tengo como FULLTEXT
__________________
Follow me on twitter @franbedia

Última edición por gnzsoloyo; 30/12/2014 a las 09:59
  #2 (permalink)  
Antiguo 07/01/2015, 14:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Búsquedas por texto

Hola fbedia:

La mejor opción para hacer búsquedas de textos, son definitivamente las BÚSQUEDAS DE TEXTO COMPLETO, sin embargo, hay que tener cuidado en algunos aspectos.

Cita:
Por ejemplo, si quiero buscar la pelicula "El señor de los anillos":

SELECT titulo FROM videos WHERE MATCH(titulo) AGAINST ('anillo')

Esta consulta no me devuelve resultados... por lo que no me vale
Mucho ojo, no sé cuantos registros tienes en tu tabla, pero es posible que la consulta esté arrojando vacío debido a que encuentra muchos registros que cumplen la condición de búsqueda... lo mismo pasa con tu otro ejemplo:


Cita:
Otro ejemplo, es que para buscar la pelicula "VHS":

SELECT titulo FROM videos WHERE MATCH(titulo) AGAINST ('VHS')

No me devuelve resultados, ya que solo son 3 caracteres y tiene que ser a partir de 4
La razón para "obligar" a que las cadenas de búsqueda sean de 4 caracteres o más, es precisamente para evitar que puedan aparecer muchos registros que cumplan con la búsqueda. Checa esta liga:

http://dev.mysql.com/doc/refman/5.0/...ne-tuning.html

Ahí te dan algunos tips para "alterar" los criterios para la búsqueda de texto completo.

En lo particular prefiero utilizar IN BOOLEAN MODE, ya te que da más flexibilidad para crear tus cadenas de búsqueda. Dices que ya utilizaste operadores + - *, sin embargo no nos dices cómo es es que creaste tus Expresiones regulares. Puedo apostar mi café de la mañana a que hay algún error en la manera en que estás utilizando estos operadores.

Finalmente, siempre podrás utilizar más de una técnica de búsqueda... para tu caso utilizando LIKE sería simplemente o si lo prefieres utilizar expresiones regulares:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------------------------+
  3. | id   | descripcion              |
  4. +------+--------------------------+
  5. |    1 | El señor de los anillos  |
  6. |    2 | anillo de compromiso     |
  7. |    3 | otra pelicula de anillos |
  8. |    4 | esta no                  |
  9. +------+--------------------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla WHERE descripcion LIKE '%anillo%';
  13. +------+--------------------------+
  14. | id   | descripcion              |
  15. +------+--------------------------+
  16. |    1 | El señor de los anillos  |
  17. |    2 | anillo de compromiso     |
  18. |    3 | otra pelicula de anillos |
  19. +------+--------------------------+
  20. 3 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT * FROM tabla WHERE descripcion REGEXP 'anillo';
  23. +------+--------------------------+
  24. | id   | descripcion              |
  25. +------+--------------------------+
  26. |    1 | El señor de los anillos  |
  27. |    2 | anillo de compromiso     |
  28. |    3 | otra pelicula de anillos |
  29. +------+--------------------------+
  30. 3 rows in set (0.00 sec)

Saludos
Leo
  #3 (permalink)  
Antiguo 07/01/2015, 14:59
 
Fecha de Ingreso: abril-2003
Mensajes: 13
Antigüedad: 21 años
Puntos: 0
Respuesta: Búsquedas por texto

A la cita de leonardo, yo acostumbro convertir los string de la expresion a mayusculas o minusculas
Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE UPPER(descripcion) LIKE UPPER('%anillo%');

Etiquetas: select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:46.