entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Buscador PHP MYSQL encontrar coincidencias aunque no sean idéntica

Estoy realizando un buscador para mi sitio web. Mi problema es que si por ejemplo tengo un articulo titulado "Descarga esta aplicacion" pero el usuario busca solo "DESCARGAR" entonces no muestra el articulo titulado "Descarga esta aplicacion" debido a que el usuario busco "DESCARGAR" y en el titulo del post esta escrito de una forma aplicativa o sea sin la "R" no se si logro explicarme...

Este es mi codigo simple

<?

include '../php/conexion-pbd.php';  
    $select_post = "SELECT * FROM post_pbd WHERE titulo LIKE '%$busqueda%'";

    $r_select_post = mysqli_query($con,$select_post);

    if(!mysqli_num_rows($r_select_post) > 0){

    $b = explode(' ', $busqueda);

    $select_post = "SELECT * FROM post_pbd WHERE titulo LIKE '%$b[0]%' OR titulo LIKE '%$b[1]%'";  

            $r_select_post = mysqli_query($con,$select_post);

    }

    while($row_post = mysqli_fetch_array($r_select_post)){

}

Alguna idea?

pedrourday comentado Oct 8

Hola @jorge98

Tengo varias preguntas y posiblemente una buena solución a tu problema que también fue mio y me saco canas verdes. Esta solución no requiere nada de lo que dijeron en los otras respuestas.

Las preguntas:

Si hago la consulta SQL sin la condición WHERE:

SELECT * FROM post_pbd;

estimativamente alrededor de cuantos resultados arrojaría?

Si arrojara demasiados resultados, se puede agregar en la condición WHERE del SELECT, además del campo "titulo", algún campo indexado para optimizar?

Conoces el paradigma de programación funcional?

Saludos!

jorge98 comentado Oct 8

"post_pbd" significa posts publicados o sea arrojaría todo los post q se hayan publicado. Ademas de titulo también creo q seria bueno hacer una búsqueda en etiquetas y descripción..
Y no conozco muy bien ese paradigma

Que solución me propones?

1 Respuesta

3votos

magarzon Puntos20570

Vayamos por partes.

Si lo que quieres es hacer algo serio, lo mejor es utilizar herramientas especializadas, tipo Apache Lucene o ElasticSearch (esta basada en la anterior y mi recomendación).

Si por diferentes cuestiones quieres seguir con PHP+MySQL, deberías utilizar índices FULLTEXT (Nota: alguna de las cosas que voy a poner a continuación puede que no estén disponibles en versiones antiguas de MySQL)

Para crear un índice FULLTEXT solo tienes que ejecutar esto en MYSQL:

ALTER TABLE POST_PBD ADD FULLTEXT(TITULO);

Si además de por el título quisieras buscar por algún otro campo, lo tendrías que añadir al índice.

Una vez creado el índice, la consulta sería así:

$select_post = "SELECT * FROM POST_PBD WHERE MATCH(TITULO) AGAINST ('$busqueda' IN NATURAL LANGUAGE MODE)";

Este típo de índices te permiten además buscar con wildcards (*, ., etc.) y además te dan una puntuación de cómo los registros coinciden con tu búsqueda, de manera que podrías ordenar tus búsquedas poniendo primero la más "acertada":

$select_post = "SELECT * , MATCH (TITULO) AGAINST ('$busqueda' IN NATURAL LENGUAGE MODE) AS puntuacion FROM POST_PBD WHERE MATCH (TITULO) AGAINST ('$busqueda' IN NATURAL LANGUAGE MODE) ORDER BY puntuacion DESC";

Como decía, esto mejora tu buscador, pero es posible que tampoco solucione tu caso particular (en especial porque para inglés va bien, pero en otros idiomas tiene sus problemas).

Para hacer tu buscador aún más perfecto habría ya que complicarse con algoritmos usando la función levenshtein (que calcula cómo de "parecidas" son dos palabras), pero para eso, lo que recomendaba, ElasticSearch.

Saludos.

Leonardo-Tadei comentado Oct 2

Excelente y detallada respuesta
+1

Ahora, el gran dilema del programador: programar uno mismo o usar cosas que programó otro?

Respuesta: depende del presupuesto que se tenga!

magarzon comentado Oct 2

Bueno, yo lo tengo claro. No se trata solo de desarrollar una funcionalidad, se trata de desarrollarla, probarla, mantenerla, actualizarla, mejorarla... Lo que otros puedan hacer por mí, es tiempo que tengo yo para hacer otras cosas. Además de que si no soy experto en ese campo, siempre otros que sí lo sean lo van a hacer mejor que yo.
En mi empresa, que no vamos cortos de presupuesto precisamente, utilizamos software de terceros (el mismo ElasticSearch) en todo aquello en lo que no somos especialistas (en nuestro caso, sistemas de realtime).
Otra cosa es que quieras aprender, o que se trate de un proyecto personal, o que quieras probar cosas...

jorge98 comentado Oct 2

Tienes razon! me tomaría mucho tiempo e investigación desarrollar un buscador bien elaborado.

He investigado un poco en Internet acerca de la instalación de ElasticSearch, pero me pudieras orientar un poco sobre como instalarlo en mi web y lograr que haga las búsquedas en mi base de datos para luego mostrarlas dentro de un bluce?

magarzon comentado Oct 2

Las instrucciones de instalación las tienes aquí: https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html

Luego lo que tienes que hacer es que cada vez que insertas o modificas algo en tu base de datos, lo tienes que hacer también en ElasticSearch.
A la hora de buscar, buscas primero en ES, y luego con los ids que te retorna, buscas los datos en tu BD (también podrías devolver directamente lo que te retorna ElasticSearch, si almacenas todo tu registro allí)

Tienes esta librería que te va a simplificar el manejo de ES desde PHP: http://elastica.io/

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta