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

Busqueda FullText con MATCH y AGAINST

Estas en el tema de Busqueda FullText con MATCH y AGAINST en el foro de Mysql en Foros del Web. Buenas. No sé si será posible lo que quiero. Pretendo mostrar cualquier fila que contenga al menos una de las palabras buscadas, y en caso ...
  #1 (permalink)  
Antiguo 30/11/2013, 14:09
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Busqueda FullText con MATCH y AGAINST

Buenas.

No sé si será posible lo que quiero. Pretendo mostrar cualquier fila que contenga al menos una de las palabras buscadas, y en caso de coincidir en varias, que lo ordene de mayor a menor número de coincidencias.

idNoticia-------titulo------------------desarrollo
1--------------google--------------buscador, search
2--------------yahoo---------------buscador, motores, cohetes
3--------------bing------------------chorizo, tocino
4--------------hakia----------------buscador, motores
5--------------ask-------------------motores, flamenco, cohetes

Tengo creado un Índice FULLTEXT en esa tabla llamado indicito para el campo desarrollo.

Si por ejemplo busco:
Código MySQL:
Ver original
  1. SELECT * FROM buscador WHERE MATCH(desarrollo) AGAINST('motores buscador cohetes')

Me muestra el resultado 2 y 5:

2--------------yahoo---------------buscador, motores, cohetes
5--------------ask-------------------motores, flamenco, cohetes

No entiendo por que no aparecen también otros resultados como el 1, que contiene "buscador" y el 4, que contiene también "buscador".

*PD: Sólo quiero que busque únicamente en la columna desarrollo.

Última edición por gnzsoloyo; 30/11/2013 a las 14:42
  #2 (permalink)  
Antiguo 30/11/2013, 15:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Busqueda FullText con MATCH y AGAINST

todo está bien, excepto el número de registros que tienes para una búsqueda full text. Te bastará añadir 4 o 5 registros más en los que no haya coincidencia, es decir, que no aparezca esa palabra, para que te devuelva todos aquellos en los que aparece (he hecho la prueba). Haz la prueba tú y verás que es así. Tiene que ver con el valor semántico muy bajo de las palabras que se repiten mucho (pueden llegar a convertirse en palabras de parada), y tú casi has repetido "buscador" en todos los registros que tienes.
Esto está sacado del manual y ahí se explica el problema:
Cita:
Una técnica de este tipo funciona mejor con colecciones grandes (de hecho, se ajustó con cuidado para funcionar de este modo). Para tablas muy pequeñas, la distribución de palabras no refleja automáticamente su valor semántico, y este modelo puede producir resultados extraños en ocasiones. Por ejemplo, aunque la palabra “MySQL” está presente en cada registro de la tabla articles, una búsqueda de esta palabra no da resultados.

mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)

El resultado de búsqueda es vacío porque la palabra “MySQL” está presente al menos en el 50% de los registros. Como tal, se trata efectivamente como una palabra de parada. Para conjuntos grandes, este es el comportamiento más deseable--una consulta en lenguaje natural no debe retornar cada segundo registro de una tabla de 1GB. Para conjuntos pequeños, puede ser menos deseable.

Una palabra que coíncide la mitad de registros en una tabla es menos deseable para localizar documentos relevantes. De hecho, es más fácil encontrar muchos documentos irrelevantes. Todos sabemos que esto pasa demasiado frecuentemente cuando tratamos de buscar algo en Internet con un motor de búsqueda. Es con este razonamiento que los registros que contienen la palabra se les asigna un valor semántico bajo para el conjunto particular en que ocurre. Una palabra dada puede exceder el límite del 50% en un conjunto pero no en otro.

El límite de 50% tiene una implicación significante cuando intenta una primera búsqueda full-text para ver cómo funciona: si crea una tabla e inserta sólo uno o dos registros de texto en ella, cada palabra en el texto aparece al menos en el 50% de los registros. Como resultado, no se retorna ningún resultado. Asegúrese de insertar al menos tres registros, y preferiblemente muchos más.

Última edición por jurena; 01/12/2013 a las 03:04
  #3 (permalink)  
Antiguo 01/12/2013, 03:43
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Busqueda FullText con MATCH y AGAINST

Cita:
Iniciado por jurena Ver Mensaje
todo está bien, excepto el número de registros que tienes para una búsqueda full text. Te bastará añadir 4 o 5 registros más en los que no haya coincidencia, es decir, que no aparezca esa palabra, para que te devuelva todos aquellos en los que aparece (he hecho la prueba). Haz la prueba tú y verás que es así. Tiene que ver con el valor semántico muy bajo de las palabras que se repiten mucho (pueden llegar a convertirse en palabras de parada), y tú casi has repetido "buscador" en todos los registros que tienes.
Esto está sacado del manual y ahí se explica el problema:
¿Entonces la única solución es meter esos 4 ó 5 registros de más? ¿Es un número concreto de resultados no relevantes (4 ó 5) el que hay que meter? ¿No hay otra forma más segura de que los muestre y se consiga lo que pretendo?

Por otro lado ¿Cómo se puede hacer para que "lea" dentro de cada palabra por ejemplo "cador" en vez de "buscador"?

Gracias por la respuesta.

Última edición por juanito_29899; 01/12/2013 a las 10:35
  #4 (permalink)  
Antiguo 01/12/2013, 14:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Busqueda FullText con MATCH y AGAINST

Si usas la búsqueda booleana de full-text, podrás encontrarlos aunque tengas menos registros, es decir, esa norma del 50% no se cumple en la búsqueda booleana.
Código MySQL:
Ver original
  1. FROM buscador
  2. WHERE MATCH (desarrollo) AGAINST ('buscador' IN BOOLEAN MODE)
respecto a lo otro que preguntas, la búsqueda truncada, usando asterisco, no puedes hacerla, creo, con búsqueda boolena ni con full-text, salvo que el truncado sea la segunda parte de una palabra, no el comienzo. Para eso puedes usar una busqueda con LIKE sin índice FULL-TEXT. El full-text está pensado para búsqueda de palabras, no de parte de cadenas.
  #5 (permalink)  
Antiguo 01/12/2013, 14:50
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Busqueda FullText con MATCH y AGAINST

Cita:
Iniciado por jurena Ver Mensaje
Si usas la búsqueda booleana de full-text, podrás encontrarlos aunque tengas menos registros, es decir, esa norma del 50% no se cumple en la búsqueda booleana.
Código MySQL:
Ver original
  1. FROM buscador
  2. WHERE MATCH (desarrollo) AGAINST ('buscador' IN BOOLEAN MODE)
respecto a lo otro que preguntas, la búsqueda truncada, usando asterisco, no puedes hacerla, creo, con búsqueda boolena ni con full-text, salvo que el truncado sea la segunda parte de una palabra, no el comienzo. Para eso puedes usar una busqueda con LIKE sin índice FULL-TEXT. El full-text está pensado para búsqueda de palabras, no de parte de cadenas.
Ya conocía el Boolean Mode y todos sus complementos aunque no sabía lo del 50%.

Imagino que no se podrá conseguir la "concordancia mega-amplia" que busco ya que además pediría un mínimo de caracteres para buscar. El asterisco en Boolean Mode no me sirve ya que sólo vale para Españ* (España) pero no para *Spañ*, tal como sí haría LIKE %Spañ%, pero con la diferencia de devolverlo ordenado por relevancia y número de coincidencias que es lo que busco.
  #6 (permalink)  
Antiguo 02/12/2013, 04:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Busqueda FullText con MATCH y AGAINST

No sé si has entendido bien lo del 50%. Lo que quiere decir es que FULL-TEXT no te funcionará como quieres para buscar términos que aparecen en más del 50% de tus registros, pero no creo que eso vaya a ser tu caso.
Respecto a lo segundo, entiendo tu problema con la relevancia. Sé que existen otras posibilidades con índices full-text que tal vez te permitirán todo lo que quieres, aunque no lo he probado. Me refiero a Lucene y Sphinx. Echa un vistazo, si es que no lo has hecho ya.
  #7 (permalink)  
Antiguo 02/12/2013, 14:25
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: Busqueda FullText con MATCH y AGAINST

Cita:
Iniciado por jurena Ver Mensaje
Me refiero a Lucene y Sphinx.
La verdad es que no conocía ninguno de los dos. Les echaré un vistazo. A ver si hay ejemplos y tutoriales en español, que de las cosas más remetidas y menos usadas, siempre está casi todo en inglés.

Gracias.

Etiquetas: busqueda, campo, fulltext, match, 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 08:16.