Foros del Web » Programando para Internet » PHP »

Buscador con frases en cualquier orden

Estas en el tema de Buscador con frases en cualquier orden en el foro de PHP en Foros del Web. Hola! Tengo un buscador realizado con php y mysql, busqueda mediante FULLTEXT, no uso el LIKE, pero tengo el siguiente problema. Si busco 'Delta Force', ...
  #1 (permalink)  
Antiguo 05/10/2007, 00:37
 
Fecha de Ingreso: mayo-2005
Ubicación: Muy lejos de aquí
Mensajes: 367
Antigüedad: 18 años, 11 meses
Puntos: 0
Buscador con frases en cualquier orden

Hola!

Tengo un buscador realizado con php y mysql, busqueda mediante FULLTEXT, no uso el LIKE, pero tengo el siguiente problema.

Si busco 'Delta Force', por ejemplo, me encuentra lo que busco, pero si pongo 'Force Delta' no me encuentra nada.

¿Alguien sabe como hacer que me encuentre los mismos resultados aunque el orden de las palabras sea diferente?

saludos
  #2 (permalink)  
Antiguo 05/10/2007, 09:22
 
Fecha de Ingreso: marzo-2005
Ubicación: Sevilla
Mensajes: 277
Antigüedad: 19 años, 1 mes
Puntos: 2
Re: Buscador con frases en cualquier orden

busca las palabras por separado;
ejemplo:

Código:
$texto=$_POST['texto'];
$texto=mysql_real_escape_string($texto);
$palabras=explode(" ", $texto);
$total_palabras=count($palabras);

$query="SELECT * FROM tabla WHERE 1=2";

for ($i=0;$i<$total_palabras;$i++){
$query.=" OR campo LIKE '%" . $palabras[$i] . "%'";  
}
pequeña explicación:
si pasas las palabras force delta las separará, y obtendrá un array con dos posiciones, en [0]=force y en [1]="delta"

y luego quedará una consulta tal como

SELECT * FROM tabla WHERE 1=2 OR campo LIKE '%force%' OR campo LIKE '%delta%'

El 1=2 lo pongo para que en caso de no pasar nada, laconsulta queda:
SELECT * FROM tabla WHERE 1=2, y por tanto no selecciona nada.


NOTA: lanzará todos los resultados que contengan una de las dos palabras, si lo que quiere es que muestre los resultados que contengan todas las palabras, es decir, que si contiene solo delta, no lo muestre, entonces cambia el OR por un AND:

Código:
$texto=$_POST['texto'];
$texto=mysql_real_escape_string($texto);
$palabras=explode(" ", $texto);
$total_palabras=count($palabras);

$query="SELECT * FROM tabla WHERE 1=2";

for ($i=0;$i<$total_palabras;$i++){
       if ($i==0){
       $query.=" OR (campo LIKE '%" . $palabras[$i] . "%'";
       }
       else{
       $query.=" AND campo LIKE '%" . $palabras[$i] . "%'";  
       }
}
if ($total_palabras>0){
$query.=")";
}
Así la sentencia quedaría:

SELECT * FROM tabla WHERE 1=2 OR (campo LIKE '%delta%' AND campo LIKE '%force%')

y si no pasa palabras quedaria: SELECT * FROM tabla WHERE 1=2

En fin, volviendo a lo mismo, esto buscaría palabras que que contenga delta y force ala vez. Pero por ejemplo en la palabra forcejear encontraría la palabra force.

UN saludo y espero k te sirva

Última edición por Manu_Leon; 05/10/2007 a las 09:33
  #3 (permalink)  
Antiguo 05/10/2007, 10:13
 
Fecha de Ingreso: mayo-2005
Ubicación: Muy lejos de aquí
Mensajes: 367
Antigüedad: 18 años, 11 meses
Puntos: 0
Re: Buscador con frases en cualquier orden

Esa opcion la habia pensado, pero una consulta con tanto LIKE puede ser brutal y segun el tamaño de la BBDD puede tardar un ratito, por lo que no se si sería la forma más adecuada. Gracias por el aporte.

¿Alguien conoce otra forma?
  #4 (permalink)  
Antiguo 06/10/2007, 03:26
 
Fecha de Ingreso: mayo-2005
Ubicación: Muy lejos de aquí
Mensajes: 367
Antigüedad: 18 años, 11 meses
Puntos: 0
Re: Buscador con frases en cualquier orden

¿Nada de nada? solo con LIKE?
  #5 (permalink)  
Antiguo 06/10/2007, 06:53
 
Fecha de Ingreso: mayo-2005
Mensajes: 74
Antigüedad: 18 años, 10 meses
Puntos: 2
Re: Buscador con frases en cualquier orden

Si, yo he hecho algo parcido no hace mucho, con like...la base de datos es mySql, tiene mas de 10000 registros y va como un tiro...

Así que si la bd no es muy grande, te vale perfectamente.
  #6 (permalink)  
Antiguo 07/10/2007, 22:30
 
Fecha de Ingreso: junio-2007
Mensajes: 76
Antigüedad: 16 años, 9 meses
Puntos: 1
Re: Buscador con frases en cualquier orden

Hola Lanceousp. Mira yo tambien estoy armando un buscador y me estoy peleando con MATCH AGAINST. Me esta dando algunos problemas pero parece interesante. Hipoteticamente seria mas rapido que utilizar like y sirve para busquedas multiples, ya sea de multiples palabras a buscar como de multiples campos. Hay vastantes paginas con referencias aunque creo que las que encontre manejan el mismo codigo. Te lo dejo aca fijate, talvez te sirve. Se dice que es mas rapido, no lo se. Si te funciona me gustaria saberlo, a ver si logro resolver el problema que me da con el LIMIT. Se usa con un indice FULLTEXT. Si solo se busca una palabra la consulta se hace con LIKE si es con mas usa lo que MATCH AGAINST. Tenes que crear un indice FULLTEXT, al menos eso decia donde lo encontre. Intente encontrar la pagina para dejartela pero no di con ella.

Código PHP:
SELECT * , MATCH (TITULO,DESARROLLOAGAINST ('$busqueda') AS puntuacion FROM ARTICULOS WHERE MATCH (TITULODESARROLLOAGAINST ('$busqueda'ORDER BY puntuacion DESC LIMIT 50 

Código PHP:
 <?php
//cadena de conexion
mysql_connect("host","usuario","password");
//DEBO PREPARAR LOS TEXTOS QUE VOY A BUSCAR si la cadena existe
if ($busqueda<>''){
//CUENTA EL NUMERO DE PALABRAS
$trozos=explode(" ",$busqueda);
$numero=count($trozos);
if (
$numero==1) {
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON LIKE
$cadbusca="SELECT REFERENCIA, TITULO FROM ARTICULOS WHERE VISIBLE =1 AND DESARROLLO LIKE '%$busqueda%' OR TITULO LIKE '%$busqueda%' LIMIT 50";
} elseif (
$numero>1) {
//SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA AVANZADO DE MATCH AGAINST
//busqueda de frases con mas de una palabra y un algoritmo especializado
$cadbusca="SELECT REFERENCIA, TITULO , MATCH ( TITULO, DESARROLLO ) AGAINST ( '$busqueda' ) AS Score FROM ARTICULOS WHERE MATCH ( TITULO, DESARROLLO ) AGAINST ( '$busqueda' ) ORDER BY Score DESC LIMIT 50";
}
$result=mysql("teleformacion"$cadbusca);
While(
$row=mysql_fetch_object($result))
{
//Mostramos los titulos de los articulos o lo que deseemos...
$referencia=$row->REFERENCIA;
$titulo=$row->TITULO;
echo 
$referencia." - ".$titulo."<br>";;
}
?>
Mi buscador me esta dando un problema, me hace diferencia de minusculas y mayusculas y tildes. Lo que mas me complica es que ya hice un buscador tiempo atras y no me da este problema pero no logro terminar de darme cuenta porque. Pedi ayuda en el foro pero no logre nada, creo que tiene que ver con la configuracion de la base. Si alguien sabe como hacer para que una busqueda de resultados ya se busque por ejemplo Vasos - vasos, o Ajíes - ajies. Estare enormemente agradecido.

Saludos...
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:40.