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

Ordenar por número de coincidencias

Estas en el tema de Ordenar por número de coincidencias en el foro de Mysql en Foros del Web. Hola a todos!, tengo un problema con ordenar los resultados de mi buscador por coincidencias. El código del buscador está en php (si lo necesitan ...
  #1 (permalink)  
Antiguo 21/04/2011, 11:32
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Pregunta Ordenar por número de coincidencias

Hola a todos!, tengo un problema con ordenar los resultados de mi buscador por coincidencias. El código del buscador está en php (si lo necesitan se los dejo)

Tengo 4 tablas:
ID:
Titulo:
Descripcion:
Keywords:

Les dejo el codigo:

Código:
$sqlBuscar = mysql_query("SELECT webTitulo, webDescripcion, weburl, 
                              MATCH (webTitulo, webDescripcion, weburl, webkeywords) 
                              AGAINST ('$frase' IN BOOLEAN MODE) AS coincidencias 
                              FROM webs 
                              WHERE MATCH (webTitulo, webDescripcion, webkeywords)
                              AGAINST ('$frase' IN BOOLEAN MODE) 
                              ORDER BY coincidencias DESC", $server_link) 
                              or die(mysql_error());                            
    $totalRows = mysql_num_rows($sqlBuscar);
Supuestamente debería ordenarlos descendentemente pero no lo hace, por ejemplo busqué día de la tierra, y el resultado sobre día de la tierra apareció último, probé aumentando la densidad de Día de la Tierra en el último resultado y no funcionó, sigue último.

¿Alguien sabe cómo ordenar los resultados por coincidencias?

Muchas gracias!
  #2 (permalink)  
Antiguo 21/04/2011, 11:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar por número de coincidencias

Me parece que estás intentando planchar lo planchado...
Según el manual de referencia (12.7. Funciones de búsqueda de texto completo (Full-Text)):
Cita:
Cuando se usa MATCH() en una cláusula WHERE , como en el ejemplo precedente, los registros retornados se ordenan automáticamente con la relevancia mayor primero. Los valores relevantes son números en coma flotante no negativos. Relevancia cero significa que no tiene similaridad. La relevancia se computa basada en el número de palabras en el registro, el número de palabras únicas en este registro, el número total de palabras en la colección, y el número de documentos (registros) que contienen una palabra particulas.
En esencia lo que significa es que el resultado se ordena siempre como lo estás pidiendo: mayor relevancia, significa mayor cantidad de coincidencias...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/04/2011, 11:55
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Ordenar por número de coincidencias

entonces no es necesario el ORDER BY?, es que estoy intentando de que se ordenen y le agrego más palabras para que tenga mayor cantidad de coincidencias pero no pasa nada el resultado que quiero que aparezca más arriba sigue útlimo, sólo se están ordenando por ID creo.

Saludos!
  #4 (permalink)  
Antiguo 21/04/2011, 12:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar por número de coincidencias

Verifica qué pasa cuando quitas el campo ID del SELECT.
Es más: Quita ese pedazo que carece de sentido allí:
Cita:
MATCH (webTitulo, webDescripcion, weburl, webkeywords) AGAINST ('$frase' IN BOOLEAN MODE) AS coincidencias
Eso ya está en el WHERE, no lo necesitas en el SELECT.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/04/2011, 12:05
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Ordenar por número de coincidencias

Borré la parte que me dijiste, pero ahora al buscar me marca este error:

Cita:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM webs WHERE MATCH (webTitulo, webDescripcion,' at line 2
Saludos!
  #6 (permalink)  
Antiguo 21/04/2011, 12:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar por número de coincidencias

Cita:
Edito: Para borrar el ID lo debería hacer desde la base de datos.
1) No digo que borres el campo de la tabla, sino que no lo invoques.
2) Postea la sentencia completa, porque el error debe estar antes de ese punto. Revisa la sintaxis con cuidado... Borrar ese pedazo del SELECT no tiene por qué generar error, ya que es irrelevante. Fíjate si la sintaxis quedó bien una vez eliminado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 21/04/2011, 12:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar por número de coincidencias

O sea, así:
Código MySQL:
Ver original
  1.   webTitulo,
  2.   webDescripcion,
  3.   weburl
  4. FROM webs
  5. WHERE MATCH (webTitulo, webDescripcion, webkeywords) AGAINST ('$frase' IN BOOLEAN MODE)
  6. ORDER BY coincidencias DESC
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 21/04/2011, 12:16
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Ordenar por número de coincidencias

Cita:
Iniciado por gnzsoloyo Ver Mensaje
1) No digo que borres el campo de la tabla, sino que no lo invoques.
2) Postea la sentencia completa, porque el error debe estar antes de ese punto. Revisa la sintaxis con cuidado...
EDITO: Ahí quedo bien ordenado pero me escribe otro error diferente:

Cita:
Unknown column 'coincidencias' in 'order clause'
Y si vuelvo a añadir AS coincidencias sale el error:

Cita:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS coincidencias ORDER BY coincidencias DESC' at line 6
Se que no te referías a la tabla pero es el único lugar en el que se encuentra y se ordenan mediante el ID no sé cómo pasa eso jaja.

Acá dejo todo el código:

Código:
<?php 
// conectar al servidor 
$server_link = mysql_connect("Aca el servidor", "Usuario", "Contraseña"); 
if(!$server_link){ 
    die("Fall&oacute; la Conexi&oacute;n ". mysql_error()); 
} 
// seleccionamos la base de datos 
$db_selected = mysql_select_db("Base de datos", $server_link); 
if(!$db_selected){ 
    die("No se pudo seleccionar la Base de Datos ". mysql_error()); 
} 
// verificamos que se haya enviado una consulta 
if(isset($_GET['buscar']) && $_GET['buscar'] == 'Buscar'){ 
    $frase = htmlspecialchars($_GET['frase']); 
    // hacemos la consulta de busqueda
	$tiempoinicio = microtime();
    $sqlBuscar = mysql_query("SELECT webTitulo, webDescripcion, weburl, 
                              MATCH (webTitulo, webDescripcion, weburl, webkeywords) 
                              AGAINST ('$frase' IN BOOLEAN MODE) AS coincidencias 
                              FROM webs 
                              WHERE MATCH (webTitulo, webDescripcion, webkeywords)
                              AGAINST ('$frase' IN BOOLEAN MODE) 
                              ORDER BY coincidencias DESC", $server_link) 
                              or die(mysql_error());                               
    $totalRows = mysql_num_rows($sqlBuscar);
	$tiempofinal = microtime(); 
    $tiempo = ($tiempofinal-$tiempoinicio);
	// Enviamos un mensaje 
    // indicando la cantidad de resultados ($totalRows) 
    // para la frase buscada ($frase) 
    if(!empty($totalRows)){ 
        echo stripslashes("<p>Se encontraron <strong>$totalRows</strong> resultados para <strong>$frase</strong> en: <strong>$tiempo</strong> segundos</p>");         
        // mostramos los resultados 
        while($row = mysql_fetch_array($sqlBuscar)){ 
            echo "<strong><a href=$row[weburl]>$row[webTitulo]</a></strong>"; 
            echo "<p>".substr(strip_tags($row['webDescripcion']), 0, 255)."...</p>"; 
        }   
    } 
    // si se ha enviado vacio el formulario 

    // Error debe introducir una palabra 
    elseif(empty($_GET['frase'])){ 
        echo "Debe introducir una palabra para su búsqueda"; 
    } 
    // si no hay resultados 
    // No se encontraron resultados 
    elseif($totalRows == 0){ 
        echo stripslashes("No se encontraron resultados para <strong>$frase</strong>"); 
    } 
} 
?>
Añadí la mayor cantidad de veces la palabra Tierra y los resultados ni se modifican no entiendo bien porque.

Saludos y gracias por toda tu ayuda!!

Última edición por xarmagedonx; 21/04/2011 a las 12:23
  #9 (permalink)  
Antiguo 21/04/2011, 12:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar por número de coincidencias

Mira: Las respuestas a tu problema están en el manual de referencia:

- MATCH ... AGAINST trabaja por relevancia, no por coincidencia en el sentido que un texto con muchas apariciones de una misma palabra es más coincidente. Todo lo contrario, implica que no puede discriminar cuál documento es el que buscas, o qué segmento, porque hay demasiadas apariciones.

- Cuando hay demasiadas apariciones de una palabra en el documento, o bien demasiados documentos con esa palabra, la relevancia tiende a cero.

- Mientras más corta es la palabra, menor relevancia tiene. Algunas se descartan.

- No puede discriminar palabras parciales. Sólo trabaja con palabras completas y bien definidas.

- Si la palabra es muy corta, es posible afinar la búsquea con expansión de conusulta, usando WITH QUERY EXPANSION. Revisa el manual.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: coincidencias
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 22:45.