Foros del Web » Programando para Internet » PHP »

buscador php mysql ("Fulltext")

Estas en el tema de buscador php mysql ("Fulltext") en el foro de PHP en Foros del Web. hola a todos me estoy volviendo loco ya que he buscado por todos lados algun ejemplo y el que encontre no anda tambien busque aqui ...
  #1 (permalink)  
Antiguo 08/09/2006, 10:19
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
buscador php mysql ("Fulltext")

hola a todos me estoy volviendo loco ya que he buscado por todos lados algun ejemplo y el que encontre no anda
tambien busque aqui y lo unico que sale es un link a mysql
pero alli no sale nada de lo que busco ya que lo que quiero es que ande en php no en modo consola de mysql
ya que no encuentro nada de informacion sobre crear un buscador con php mysql con fulltext

este es el codigo espero que me ayuden

buscar.htm

Código HTML:
<FORM METHOD="get" ACTION="buscar.php">
  Buscar: <INPUT TYPE="text" NAME="busqueda">
</FORM> 


la tabla de la base de datos seria


referencia (int11)
titulo (varchar(100))
desarrollo (text)
autor (varchar(50))


Los tipos de los campos a buscar deberán ser CHAR, VARCHAR o TEXT con sus variantes.






creo con myphpadmin

Código HTML:
ALTER TABLE ARTICULOS ADD FULLTEXT(TITULO, DESARROLLO);
y lo que es el buscar.php

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>";
  }
}
?>

aqui creo que se comieron la conexion a la base de datos

que tendria que ir abajo de

Código PHP:
mysql_connect("host","usuario","password"); 
tendria que ir esto tambien no?

Código PHP:
mysql_select_db("nombrebasededatos"); 

bien cuando pongo buscar me sale la pagina en blanco

esta linea esta bien???

Código PHP:
  $result=mysql("teleformacion"$cadbusca); 
de donde saca teleformacion????

espero una ayudita y saludos

otra cosa con una refencia autoincremental cambiaria en algo?
__________________
DJJJ
  #2 (permalink)  
Antiguo 08/09/2006, 11:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
esta linea esta bien???

Código PHP:
$result=mysql("teleformacion", $cadbusca);

de donde saca teleformacion????

No sé de donde sacastes ese código .. pero según el contexto de ese código "mysql()" es una función NO de PHP .. y en ese código que presentas no se vé donde se declara ni que código usa.

Cita:
que tendria que ir abajo de


Código PHP:
mysql_connect("host","usuario","password");
En teoría sí, sería necesario .. pero visto ya que usan por ahí una función "propia" .. ves a saber si esa función hace la selección de la BBDD a usar o no? ..


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 08/09/2006, 11:25
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
de aqui cluster

Programar un buscador con PHP y MySQL

este es el enlace

http://www.programacion.com/php/articulo/adr_buscador/
__________________
DJJJ
  #4 (permalink)  
Antiguo 08/09/2006, 12:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por DJJJ Ver Mensaje
Programar un buscador con PHP y MySQL

este es el enlace

http://www.programacion.com/php/articulo/adr_buscador/
Pues .. sólo decirte que ese tutorial parece que nadie lo revisó (está lleno de comentarios de reclamos) .. Se "omitío" muchas cosas, principalmente esa función "misteriosa": mysql() que no sabemos que hace.

Bueno . . omitamos ese tutorial y veamos si se puede "arreglar" ese código.

1) Usa la selección de la BBDD: mysql_select_db() como comentastes que debería ser.

2) En lugar de:
$result=mysql("teleformacion", $cadbusca);

usemos.
Código PHP:
$result=mysql_query($cadbusca) or die (mysql_error()); 
3) ... NO me gusta el tratamiento que hace de variables "globales" .. en:
if ($busqueda<>''){

Yo usaría:
Código PHP:
if (!empty($_POST['busqueda'])){
$busqueda=$_POST['busqueda']; // por lo menos para seguir como está el código actualmente ...
// etc código ... 
(o por $_GET según pases los datos a este script ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 08/09/2006, 12:15
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
gracias cluster

muchas gracias voy a probarlo

graciasssss
__________________
DJJJ
  #6 (permalink)  
Antiguo 09/09/2006, 12:10
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
hay alguna forma de que busque mejor???

fiunciona de maravilla.

queria pregunatar si exite alguna forma de que busque mejor.
ya que si pongo ejemplo

telenovela montecristo

el resultado de la busqueda es de dos uno que sale las dos palabras que busque y el otro sale uno (telenovela)

uno que dice algo asi

la telenovela de telefe titulada montecristo...

y el otro

de la telenovela que fue protagonizada

como veran en una sale la busqueda que hize que es telenovela montecristo

pero el otro resultado es de solo telenovela no sale (montecristo)

es posible que si no estan todas las palabras que uno busca
no salga el resultado que no va????

no se si me explique mas o menos espero que si

espero alguna ayuda saludooss y gracias
__________________
DJJJ
  #7 (permalink)  
Antiguo 09/09/2006, 12:52
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 17 años, 8 meses
Puntos: 0
Eso seguramente se debe al valor semántico de la palabra 'telenovela' que debe aparecer en más del 50% de los campos que forman el índice fulltext de la tabla. Al respecto, decir que el artículo que propones habla de que la búsqueda fulltext falla en ocasiones:

Cita:
Algunos problemas. Las búsquedas realizadas con MATCH ...AGAINST en ocasiones fallan cuando el término a buscar contiene una sola palabra. Por el contrario son unas búsquedas rapidísimas que producen mejores resultados que otros métodos mas rudimentarios como el LIKE cuando se trata de varias palabras o frases.
Eso no es cierto, sino que se debe al valor semántico de cada palabra, y que MySQL analiza según distintos criterios (algunos configurables) para acotar mejor las búsquedas. Así, las búsquedas de texto completo son realmente eficaces para grandes volúmenes de información.

En lugar de extenderme más, creo que se entiende mejor haciendo una lectura detenida en la documentación oficial, que se halla, en suversión en castellano, en:

http://dev.mysql.com/doc/refman/5.0/...xt-search.html

saludos.
  #8 (permalink)  
Antiguo 11/09/2006, 07:03
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
mmm si lo lei pero que codigo usan

lei el comentario, pero como haria para hacer un buscador con like con multiples palabras de busqueda

supongo que con explode pero no se como seguir


alguna ayuda

porque hay tan pocos ejemplos de buscadores con mysql en php?

saludos
__________________
DJJJ
  #9 (permalink)  
Antiguo 11/09/2006, 07:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Podrías probar (si usas Mysql 4.0.x en adelante) las busquedas "Full text" pero en modo "Boolean":

http://www.mysql-hispano.org/page.php?id=15&pag=4

En principio con ese tipo de busquedas hasta puedes usar ciertos operadores: + - .. etc para definir mejor que busqueda quieres hacer.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 11/09/2006, 07:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por DJJJ Ver Mensaje
lei el comentario, pero como haria para hacer un buscador con like con multiples palabras de busqueda

supongo que con explode pero no se como seguir


alguna ayuda

porque hay tan pocos ejemplos de buscadores con mysql en php?

saludos
Cita:
porque hay tan pocos ejemplos de buscadores con mysql en php?
Será por qué el punto fuerte de un "buscador" es conocer el SQL particular que tu BBDD maneje al detalle?.

Conociendo que hace por ejemplo una busqueda con "LIKE" o con "Full text search" .. ahí sabras que consulta SQL debes "componer" con PHP.

Si piensas que una consulta SQL para "PHP" no es más que un "string" (cadena) .. el resto es conocimiento básico de manejo de "estrings" (como es el caso de la solución con "LIKE" que quieres hacer).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 11/09/2006, 08:12
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
gracias cluster

oye queria poner el paginator de jpinedo en los resultados de la busqueda de fulltext

Cita:
$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";
remplazando $cadbusca por $_pagi_sql


y


Cita:
While($row=mysql_fetch_object($result))
por While($row=mysql_fetch_object($_pagi_result))

pero me da un error relacionado con score en este momento no me acuerdo exactamente el error

sera que no se puede paginar con paginator???

y la ultima pregunta

conocen algun script que busque en una tabla sin fulltext???

saludos gracias por su tiempoooo
__________________
DJJJ
  #12 (permalink)  
Antiguo 11/09/2006, 08:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Deberías hacer tu pregunta en un tema nuevo (haciendo alusión que usas "Paginator") .. Te hago el comentario por qué "Paginator" sé que usa una expresión regular para poder instertar el "LIMIT" automáticamente .. Por eso es necesario revisar ese punto.

No obstante si dices tener un "error" .. lo mejor es que lo indiques textualmente!.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 13/09/2006, 12:28
 
Fecha de Ingreso: octubre-2005
Mensajes: 407
Antigüedad: 18 años, 6 meses
Puntos: 2
bueno gracias por la ayuda

voy a poner el codigo fuente que hize para hacer un buscador en php

archivo buscar.htm

Código HTML:
<FORM METHOD="get" ACTION="../buscar/buscar.php">
  Buscar:<INPUT TYPE="text" NAME="busqueda" size="30"></FORM> 
archivo buscar php

Código PHP:
<body bgcolor="#003366">
<?
include("buscar.htm");
mysql_connect("localhost","usuario",""); 
mysql_select_db("nombre base de datos"); 

if (
$busqueda<>''){ 
  
//CUENTA EL NUMERO DE PALABRAS 
  
$trozos=explode(" ",$busqueda); 
  
$numero=count($trozos); 
  if (
$numero==1) { 

$_pagi_sql="SELECT * FROM noticiassin WHERE titulo LIKE '%$busqueda%' OR titulo like '%$busqueda%' OR noticia like '%$busqueda%' OR tema like '%$busqueda%' ORDER BY id desc";

  } elseif (
$numero>1) { 
  
$busqueda "+" eregi_replace(" "," +",$busqueda);  

$_pagi_sql"SELECT id, titulo, noticia,foto, audio,tema,  
               MATCH(titulo, noticia, tema)  
               AGAINST ('$busqueda' IN BOOLEAN MODE) AS score FROM noticiassin  
               WHERE MATCH(titulo, noticia, tema)  
               AGAINST ('$busqueda' IN BOOLEAN MODE) ORDER BY id DESC"

  } 


    
$_pagi_cuantos 12;
    
$_pagi_nav_num_enlaces 10;
    include(
"paginator.inc.php");


echo
"<center><font face='Arial' style='font-size: 7pt' color='#FFFFFF'>$_pagi_navegacion<BR><BR></center>";

for (
$i=1$row mysql_fetch_row ($_pagi_result); $i++) { 

        
$tema $row[5];
        
$audio $row[4];
        
$foto $row[3];
        
$noticia $row[2];
        
$titulo $row[1];

echo 
"<center>";
echo 
$foto;
echo 
$titulo;
echo 
$noticia;
echo 
$audio
echo $tema";


echo"
<center><font face='Arial' style='font-size: 7pt' color='#FFFFFF'>$_pagi_navegacion<BR></center>";


?>
quiero resaltar esta parte del codigo que hice

Código PHP:
$busqueda "+" eregi_replace(" "," +",$busqueda); 
es para que si uno busca mas de dos palabras si en el campo que busca no estan las dos palabras no lo visualize, ya que si no aunque uno ponga una cadena a buscar y figure en la base de datos una sola palabra de la cadena el buscador la visualiza



espero que el codigo este les sirva, ya que no hay (o no he encontrado un ejemplo claro de un buscador en php con mysql)

pero gracias al foro pude hacerlo andar


ahora necesitaria que me ayuden uds para que pueda buscar en mas de una tabla.

como podria hacer???

saludos
__________________
DJJJ
  #14 (permalink)  
Antiguo 14/09/2006, 00:52
Avatar de ortiz  
Fecha de Ingreso: septiembre-2004
Mensajes: 154
Antigüedad: 19 años, 7 meses
Puntos: 0
Dudas con código

Hola, he leído el hilo sobre este buscador y bueno, parece muy interesante ese algoritmo para buscar más de una palabra.

He utilizado las consultas para probarlas antes en mi base de datos, y me devuelven resultados correctos. Yo sólo he añadido un ¿índice ? FULLTEXT sobre el campo nombre. La sentencia compleja es está:

SELECT nombre, MATCH ( nombre ) AGAINST ( '$busqueda' ) AS Score FROM juego WHERE MATCH ( nombre ) AGAINST ( '$busqueda' ) ORDER BY Score DESC LIMIT 50

Y en el mysql me devuelve resultado en cuanto pongo algún string. Pero, al aplicar el código php no me devuelve nada. No se si está relacionado con la última parte del código,
Código PHP:
$result mysql_query($query)or die (mysql_error());
    While(
$row mysql_fetch_object($result)){
        echo 
$row[1];

Estoy haciendo pruebas, pero no me devuelve nada. Y me extraña porque ya digo que las consultas directas a la bd por mysql en phpmyadmin me devuelven datos.También recojo bien la variable $busqueda, eso seguro. ¿Tengo alguna manera de ver el posible error?

Saludos y gracias!

EDITO:
Código PHP:
if (!$result) {
        
$message  'Invalid query: ' mysql_error() . "\n";
        
$message .= 'Whole query: ' $query;
        die(
$message);
    } 
Con este código busco posibles errores pero tampoco me muestra resultado alguno.
__________________
Juegos de Estrategia para PC - Warphammer.net :: Estrategia sólo en castellano

Última edición por ortiz; 14/09/2006 a las 01:11 Razón: error
  #15 (permalink)  
Antiguo 14/09/2006, 06:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si usas mysql_fetch_object .. no puedes acceder al resultado como un "array" (y menos por indice numérico):

While($row = mysql_fetch_object($result)){
echo $row[1];
}

debes acceder tipo:

Código PHP:
While($row mysql_fetch_object($result)){
        echo 
$row->nombre;

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 20:23.