En nuestro ejemplo, tendremos una tabla en la Base de Datos del tipo MyISAM, ya que este motor soporta Funciones de búsqueda de texto completo (Full-Text). La tabla en si seria en donde guardaríamos las noticias de nuestro sitio web y la búsqueda la vamos a hacer en los campos Titulo y Cuerpo de la Noticia, por lo tanto nos centraremos en ellos solamente.
Los resultados de las búsquedas se ordenarán de forma tal, que los primeros serán los que mayor cantidad de coincidencias tengan con la cadena pasada a la consulta.
La tabla MySQL:
Código sql:
El formulario HTML:Ver original
CREATE TABLE `noticias` ( `noticia_ID` INT(11) NOT NULL AUTO_INCREMENT, `noticiaTitulo` VARCHAR(200) NOT NULL, `noticiaNoticia` text NOT NULL, PRIMARY KEY (`noticia_ID`), FULLTEXT KEY `buscador` (`noticiaTitulo`,`noticiaNoticia`) ) ENGINE=MyISAM;
Todo lo vamos a hacer en una misma página: buscar.php
Código php:
Ver original
<h1><a href="<?php echo $_SERVER['PHP_SELF']; ?>”>Buscador - By RogerTM</a></h1> <form name=”buscar” action=”<?php $_SERVER['PHP_SELF'] ?>” method=”get”> Buscar: <input type=”text” size=”50″ value=”<?php echo $_GET['frase']; ?>” name=”frase” /> <input type=”submit” name=”buscar” value=”Buscar” /> </form>
Codigo PHP:
Código php:
Ver original
<?php // conectar al servidor if(!$server_link){ } // seleccionamos la base de datos if(!$db_selected){ } // varificamos que el formulario halla sido enviado // hacemos la consulta de busqueda MATCH (noticiaTitulo, noticiaNoticia) AGAINST ('$frase' IN BOOLEAN MODE) AS coincidencias FROM noticias WHERE MATCH (noticiaTitulo, noticiaNoticia) AGAINST ('$frase' IN BOOLEAN MODE) ORDER BY coincidencias DESC", $server_link) // Enviamos un mensaje // indicando la cantidad de resultados ($totalRows) // para la frase busada ($frase) echo stripslashes("<p>Su búsqueda arrojó <strong>$totalRows</strong> resultados para <strong>$frase</strong></p>"); // mostramos los resultados echo "<strong><a href='#'>$row[noticiaTitulo]</a>:</strong> <em>Coincidencias: ". round($row['coincidencias']) ."</em><br />"; } } // si se ha enviado vacio el formulario // mostramos un mensaje del tipo Oops...! echo "Debe introducir una palabra o frase."; } // si no hay resultados // otro mensaje del tipo Oops...! elseif($totalRows == 0){ } } ?>
Nota sobre la consulta:
Cita:
Este mismo post lo publique en mi Blog con alguna explicacion de mas.La función MATCH() realiza una búsqueda de lenguaje natural para cadenas contra una colección de textos. Una colección es un conjunto de una o más columnas incluídas en un índice FULLTEXT. La cadena de búsqueda se da como argumento para AGAINST(). Para cada registro en la tabla MATCH() retorna un valor de relevancia, esto es, una medida de similaridad entre la cadena de búsqueda y el texto en el registro en las columnas mencionadas en la lista MATCH().
[...]
Para búsquedas FULL-TEXT en lenguaje natural, se requiere que las columnas nombradas en la función MATCH() sean las mismas columnas incluídas en algún índice FULLTEXT en su tabla. Para la consulta precedente, tenga en cuenta que las columnas nombradas en la función MATCH() (noticiaTitulo y noticiaNoticia) son las mismas que las nombradas en la definición del índice FULLTEXT de la tabla noticias.
[...]
La consulta retorna los valores de relevancia y también ordena los registros en orden decrecente de relevancia. Para conseguir este resultado, debe especificar MATCH() dos veces: una vez en la lista SELECT y otra en la cláusula WHERE. Esto hace que no haya sobrecarga adicional, ya que el optimizador de MySQL se da cuenta que hay dos llamadas MATCH() son idénticas e invoca la búsqueda FULL-TEXT sólo una vez.
Tomado del Manual de MySQL.
[...]
Para búsquedas FULL-TEXT en lenguaje natural, se requiere que las columnas nombradas en la función MATCH() sean las mismas columnas incluídas en algún índice FULLTEXT en su tabla. Para la consulta precedente, tenga en cuenta que las columnas nombradas en la función MATCH() (noticiaTitulo y noticiaNoticia) son las mismas que las nombradas en la definición del índice FULLTEXT de la tabla noticias.
[...]
La consulta retorna los valores de relevancia y también ordena los registros en orden decrecente de relevancia. Para conseguir este resultado, debe especificar MATCH() dos veces: una vez en la lista SELECT y otra en la cláusula WHERE. Esto hace que no haya sobrecarga adicional, ya que el optimizador de MySQL se da cuenta que hay dos llamadas MATCH() son idénticas e invoca la búsqueda FULL-TEXT sólo una vez.
Tomado del Manual de MySQL.
Espero sea util
saludos y suerte
muy lindo el resaltador de codigo xD