tiempo real inteligente formulario criterios busqueda buscar buscador bootstrap avanzado php mysql sql search

real - Página de búsqueda avanzada de Php/MySql



busqueda inteligente php mysql (5)

Estoy trabajando en una página de ''búsqueda avanzada'' en un sitio donde ingresaría una palabra clave como ''Me gusta manzanas'' y puede buscar en la base de datos usando las siguientes opciones:

Buscar: con todas las palabras, con la frase exacta, con al menos una de las palabras, sin las palabras

Puedo ocuparme de la ''frase exacta'' de la siguiente manera:

SELECT * FROM myTable WHERE field=''$keyword'';

''Al menos una de las palabras'' de:

SELECT * FROM myTable WHERE field LIKE ''%$keyword%'';//Let me know if this is the wrong approach

Pero es el ''Con al menos una de las palabras'' y ''Sin las palabras'' que estoy atrapado.

¿Alguna sugerencia sobre cómo implementar estos dos?

Editar: Con respecto a "Al menos una palabra", no sería un buen enfoque utilizar el comando explotar () para dividir las palabras clave en palabras y ejecutar un ciclo para agregar

(field=''$keywords'') OR ($field=''$keywords) (OR)....

Porque hay algunas otras cláusulas Y / O en la consulta también y no conozco la cantidad máxima de cláusulas que puede haber.


Giraffe y Re0sless pooseted 2 buenas respuestas.

notas: "SELECT *" es una mierda ... solo selecciona las columnas que necesitas. Re0sless pone un "OR" entre las palabras clave. - Debería eliminar las palabras comunes ("", "i", "am", "y" .. etc) - mysql tiene un límite de 8 kb en el tamaño de la consulta, por lo que para SELECTS realmente largos, debe deslizarlo en consultas separadas. - Trate de eliminar palabras clave duplicadas (si busco "usted sabe que le gusta", el SELECT básicamente debería buscar "usted" una vez y eliminar las palabras comunes como "eso")

También intente utilizar "LIKE" y "MATCH LIKE" (vea la página man de mysql), podría hacer maravillas en las búsquedas "fuzzy".


La búsqueda es notoriamente difícil de hacer bien.

Deberías considerar usar un motor de búsqueda de terceros usando algo como Lucene o Sphider .


No estoy seguro de que pueda hacer fácilmente esas opciones de búsqueda de una manera ingenua como las otras dos.

Valdría la pena implementar un mejor motor de búsqueda si necesita admitir esos escenarios. Una simple que probablemente podría pasar por alto es algo así:

Cuando se agrega un elemento a la base de datos, se divide en las palabras individuales. En este punto, las palabras "comunes" (the, a, etc ...) se eliminan (probablemente en base a una tabla common_words). Las palabras restantes se agregan a una tabla de palabras si aún no están presentes. A continuación, se establece un enlace entre la palabra ingresada y la entrada del elemento.

Al realizar una búsqueda, se trata de obtener los ID de las palabras de la tabla de palabras y la búsqueda adecuada de los identificadores de los ítems en la tabla de unión.


Podrías usar

Con al menos una de las palabras

SELECT * FROM myTable WHERE field LIKE ''%$keyword%'' or field LIKE ''%$keyword2%'' or field LIKE ''%$keyword3%'';

Sin la palabra

SELECT * FROM myTable WHERE field NOT LIKE ''%$keyword%'';


Yo sugeriría el uso de MySQL FullText Search usando esto con la funcionalidad booleana de búsquedas de texto completo para que pueda obtener el resultado deseado.

Editar:

Ejemplo solicitado en función de las condiciones solicitadas ("Es solo un campo y pueden elegir cualquiera de las 4 opciones (es decir, 1 palabra, palabras exactas, al menos 1 palabra, sin el término).")

Asumo que estás usando php basado en tu publicación inicial

<?php $choice = $_POST[''choice'']; $query = $_POST[''query'']; if ($choice == "oneWord") { //Not 100% sure what you mean by one word but this is the simplest form //This assumes $query = a single word $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST (''{$query}'' IN BOOLEAN MODE)"); } elseif ($choice == "exactWords") { $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST (''/"{$query}/"'' IN BOOLEAN MODE)"); } elseif ($choice == "atLeastOneWord") { //The default with no operators if given multiple words will return rows that contains at least one of the words $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST (''{$query}'' IN BOOLEAN MODE)"); } elseif ($choice == "withoutTheTerm") { $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST (''-{$query}'' IN BOOLEAN MODE)"); } ?>

Espero que esto ayude para el uso completo de los operadores en las coincidencias booleanas, vea Búsquedas Booleanas de Texto Completo