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

Problema con buscador interno (order by)

Estas en el tema de Problema con buscador interno (order by) en el foro de Mysql en Foros del Web. Hola a todos!, estoy teniendo un problema con mi buscador interno en php y mysql. Me dijeron que sería mejor publicar el problema que tengo ...
  #1 (permalink)  
Antiguo 01/02/2012, 16:40
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Exclamación Problema con buscador interno (order by)

Hola a todos!, estoy teniendo un problema con mi buscador interno en php y mysql.

Me dijeron que sería mejor publicar el problema que tengo en esta sección.

Lo que intento hacer es que al buscar una palabra o frase, los resultados se ordenen por el lugar donde se encuentre dicha frase o palabra. Quisiera que primero aparezcan los resultados que tengan la palabra en el título, luego los que tengan la palabra en la descripción y por último el que tenga la palabra en las keywords.

Estuve intentando con order by, pero no logro ordenarlos como quiero, algo debo estar haciendo mal, les dejo el código:

Código PHP:
// verificar que se haya enviado una consulta 
if(isset($_GET['buscar']) && $_GET['buscar'] == 'Buscar'){ 
    
$frase htmlspecialchars($_GET['frase']); 
    
// hacer la consulta
$sssql mysql_query("SELECT webTitulo, webDescripcion, weburl, 
                              MATCH (webTitulo, webDescripcion, weburl, webkeywords) 
                              AGAINST ('$frase' IN BOOLEAN MODE) 
                              FROM webs
                              WHERE MATCH (webTitulo, webDescripcion, webkeywords)
                              AGAINST ('$frase' IN BOOLEAN MODE) 
                              ORDER BY webkeywords DESC, webTitulo ASC "
$server_link
                              or die(
mysql_error());
    
$sqlBuscar mysql_query("SELECT webTitulo, webDescripcion, weburl, 
                              MATCH (webTitulo, webDescripcion, weburl, webkeywords) 
                              AGAINST ('$frase' IN BOOLEAN MODE)
                              FROM webs 
                              WHERE MATCH (webTitulo, webDescripcion, webkeywords)
                              AGAINST ('$frase' IN BOOLEAN MODE) 
                              ORDER BY webkeywords DESC, webTitulo ASC
                              LIMIT $inicio, $TAMANO_PAGINA "
$server_link
                              or die(
mysql_error()); 
Resumiendo:

Los resultados deberían aparecer así:

1º Los que tengan la palabra buscada en el título
2º Los que tengan la palabra buscada en la descripción.
3º Los que tengan la palabra buscada en las keywords.

Saludos y gracias!!!
  #2 (permalink)  
Antiguo 02/02/2012, 03:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con buscador interno (order by)

Creo que la unica forma es haciendo tres busquedas distintas, y luego controlar las repeticiones por php o con el propio sql...te facilitaria las cosas un id facil de manejar que no sea el titulo...


SELECT id,....los del titulo

SELECT id,... los de la descripcion WHERE id NOT IN (....los id seleccionados por titulo)

SELECT id,... los de las keywords WHERE id NOT IN (....los id seleccionados por titulo + ... los id seleccionados por la descripcion)

ORDER BY solo ordena por el contenido de los campos no por otras restriciones....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 02/02/2012 a las 03:22
  #3 (permalink)  
Antiguo 02/02/2012, 17:17
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema con buscador interno (order by)

Muchas gracias por la respuesta, creo que voy a empezar a estudiar mysql, asi puedo armar estas cosas jeje.

Gracias!
  #4 (permalink)  
Antiguo 03/02/2012, 07:35
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Problema con buscador interno (order by)

Creo que otra opción posible es crear un campo 'prioridad' con valores 1,2 y 3 y ordenar la búsqueda por ese campo primero y después por el resto

Un saludo
  #5 (permalink)  
Antiguo 03/02/2012, 07:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con buscador interno (order by)

Si pero crear ese campo es complicadillo... no??... si nos cuentas como hacerlo te lo agradeceremos, aqui estamos para parender.

Un condicional que use el resultado del MATCH...AGAINST para poner los valores...??

MATCH...AGAINST te dira si MATCH no donde se ha producio el MATCH... luego el condicional...???

Otra seria hacer un UNION de las tres consultas que yo prponia agregando ese campo "prioridad" con valor fijo en cada una de las partes del UNION y luego ordenar.... Creo que no vas a ganar mucho.... con respecto a lanzar las tres consultas una detras de la otra...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 03/02/2012 a las 08:12
  #6 (permalink)  
Antiguo 03/02/2012, 15:46
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema con buscador interno (order by)

gracias por sus respuestas, tengo un par de dudas con respecto a como aplicar el código que debo armar con los 3 select.

Tengo que unir todos con UNION??

No se si estoy en lo correcto pero el código debería quedarme así??:

Código PHP:
mysql_query("SELECT *** FROM ***
                                          UNION
                      SELECT *** WHERE ** NOT IN **
                      UNION
                      SELECT *** WHERE ** NOT IN **
                      UNION
                              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()); 

Última edición por xarmagedonx; 04/02/2012 a las 01:12
  #7 (permalink)  
Antiguo 06/02/2012, 02:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con buscador interno (order by)

No yo los ejecutaria por separado....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 08/02/2012, 23:02
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema con buscador interno (order by)

Cita:
Iniciado por quimfv Ver Mensaje
No yo los ejecutaria por separado....
gracias por tus respuestas, pero como quedaría el código, osea como lo completo, porque ami me marca error, creo que debe faltar algo.

Si lo hago sin el id como sería el código??. Saludos y muchas gracias!
  #9 (permalink)  
Antiguo 10/02/2012, 05:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con buscador interno (order by)

Si no tienes id (identificador unico), aparte de que es un error de diseño, la cosa se complica....

Código MySQL:
Ver original
  1. SELECT sbcUnion.webTitulo, sbcUnion.webDescripcion, sbcUnion.weburl
  2. (SELECT webTitulo, webDescripcion, weburl, 1 as Prioridad
  3. FROM webs
  4. WHERE webTitulo like '%$frase%'
  5. SELECT webTitulo, webDescripcion, weburl, 2 as Prioridad
  6. FROM webs
  7. WHERE webDescripcion like '%$frase%'
  8. AND id NOT IN (SELECT id
  9.                         FROM webs
  10.                         WHERE webTitulo like '%$frase%')
  11. SELECT webTitulo, webDescripcion, weburl, 3 as Prioridad
  12. FROM webs
  13. WHERE weburl like '%$frase%'
  14. AND id NOT IN (SELECT id
  15.                         FROM webs
  16.                         WHERE webTitulo like '%$frase%'
  17.                         OR webDescripcion like '%$frase%')
  18. SELECT webTitulo, webDescripcion, weburl, 4 as Prioridad
  19. FROM webs
  20. WHERE webkeywords like '%$frase%'
  21. AND id NOT IN (SELECT id
  22.                         FROM webs
  23.                         WHERE webTitulo like '%$frase%'
  24.                         OR webDescripcion like '%$frase%'
  25.                         OR weburl like '%$frase%')) as sbcUnion
  26. ORDER BY sbcUnion.Prioridad,sbcUnion.webTitulo, sbcUnion.webDescripcion, sbcUnion.weburl


Esto da lo que pides, substituye id por el nombre de tu clave principal, en una sola consulta, no se si será rapida o no.

Si no tienes clave principal, como te he dicho la cosa se complica, creo que lo mejor en ese caso seria lanzar las consultas por separado y con php (a consultar en el foro de php) eliminaria las repeticiones...


Consultas separadas
Código MySQL:
Ver original
  1. SELECT webTitulo, webDescripcion, weburl
  2. FROM webs
  3. WHERE webTitulo like '%$frase%';
  4.  
  5. SELECT webTitulo, webDescripcion, weburl
  6. FROM webs
  7. WHERE webDescripcion like '%$frase%';
  8.  
  9. SELECT webTitulo, webDescripcion, weburl
  10. FROM webs
  11. WHERE weburl like '%$frase%';
  12.  
  13. SELECT webTitulo, webDescripcion, weburl
  14. FROM webs
  15. WHERE webkeywords like '%$frase%';

otro error de diseño que podrias tener por lo que se puede intuir es que el campo

webkeywords

lo estas usando como un campo multi valuado (palabra,palabra2,...) lo que se considera una mala practica.

Te dejo un link al manual, generalmente clarifica conceptos

12.7. Funciones de búsqueda de texto completo (Full-Text)

como podrás leer, si puedes ordenar por relevancia, pero la calcula MySQL no puedes modificarla....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 10/02/2012 a las 05:57
  #10 (permalink)  
Antiguo 10/02/2012, 15:59
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema con buscador interno (order by)

Le cambie el id ya que tenia otro distinto, muchas gracias por la respuesta, te deje karma =).

Tengo una duda, no con el codigo, sino en los resultados, por ejemplo busqué animales salvajes y tuve 2 resultados distintos:

En el modelo anterior tenía: 98 resultados
En el modelo actual: solo 8

Con tornado paso algo similar:

En el modelo anterior: 8 resultados para "tornado"
En el modelo actual: 9 resultados para "tornado"

Ahora estoy probando el código, voy a borrar y modificar algunas partes si puedo, para adaptarlo un poco mejor a lo que estoy necesitando.

Muchas gracias por todo, también voy a probar el segundo codigo como me dijiste, así pesa menos y carga mas rápido.

Saludos!!!

EDITO: estuve viendo y el codigo solo ordena los resultados por titulo, funciona igual que poner order by webtitulo desc. hay forma de cambiar esto?

Última edición por xarmagedonx; 10/02/2012 a las 20:46
  #11 (permalink)  
Antiguo 13/02/2012, 02:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con buscador interno (order by)

ORDER BY sbcUnion.Prioridad,sbcUnion.webTitulo, sbcUnion.webDescripcion, sbcUnion.weburl


???
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #12 (permalink)  
Antiguo 13/02/2012, 09:51
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Problema con buscador interno (order by)

ya lo modifique para que no mostrara resultados solo por titulo, pero el problema ahora es que solo muestra resultados cuando se busca una sola palabra.

Al buscar 2 o mas muestra muy pocos resultados o directamente no muestra ninguno

EDITO: Pude resolverlo con la funcion explode() de php

Última edición por xarmagedonx; 13/02/2012 a las 21:28

Etiquetas: interno, buscadores, order-by
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 23:17.