Full Text Search en MySQL

Hace mucho que no hago un post para programadores, pero hoy vuelvo y con un poco de SQL que muchos no tienen tan claro...
Para el que le interese hacer un buscador en MySQL hay una herramienta que tienen en todos sus MySQL y que pocos usan.
La maldita costumbre del "Like" hace que se olviden de usar índices y full text search, acá les dejo un poco como es la idea.



Si tenemos una tabla con nuestras noticias donde hay un título y un cuerpo principal de la nota, titulo y cuerpo, primero hay que asegurarse que sean Varchar o TEXT , no usar BLOB para esto, no sirve.

Luego hay que crear el índice:

ALTER TABLE notas ADD FULLTEXT(titulo, cuerpo); 


ahí se crea el índice para la búsqueda, esto puede ocupar un poco más de espacio pero lo importante se ve en el resultado de la búsqueda. Más rápida y eficiente que un Like, simplemente funciona como un buscador y no como una comparación sencilla y costosa como el like.

Buscamos así:

SELECT * FROM notas
WHERE MATCH(titulo, cuerpo) AGAINST ('Paleta')


donde 'Paleta' es nuestra palabra de búsqueda nos podrá traer inclusive frases o más de una palabra (el like se muere si le hacen eso)

Pero si además quieren ordenarlo por "rating" u orden de importancia de la búsqueda:

SELECT * , MATCH(titulo, cuerpo) AGAINST ('Paleta') as Score
FROM notas
WHERE MATCH(titulo, cuerpo) AGAINST ('Paleta')
ORDER BY Score DESC


(obviamente nunca usen *, ahí pongan los campos que van a usar)

Score tiene un valor que no se bien como se calcula pero nos da un orden coherente de lo que se encontró tal cual hacen algunos buscadores que imprimen un porcentaje o un valor de "acierto"

Inconvenientes:

El límite de búsqueda está configurado en el MySQL y por lo general es de 4 caracteres, así que si quieren buscar algo simple como... PHP! no lo van a poder encontrar y no va a emitir ningún resultado. Sucede eso con las búsquedas demasiado simples que resulten en un 50% de las posibilidades de encontrar, directamente da resultado nulo. Así que ese es el único detalle en contra pero a favor que busca muy rápido y más eficientemente además de que el resultado es el que queríamos.

Info completa:

http://www.mysql.com/doc/en/Fulltext_Search.html
http://www.zend.com/zend/tut/tutorial-ferrara1.php

Otros posts que podrían llegar a gustarte...

Comentarios

  • Hermann    

    No tenés ni idea de cuanto me acabás de ayudar, muchas gracias,

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    menos mal que le sirve a alguien! yo ya lo estoy implementando en el buscador del PostRev (este CMS) y funciona muy bien, espero que no sea servidor-violatorio demasiado, si el índice fue bien creado no debería ser lento para nada

    • Responder
    • Citar
    • Comentado:
  • cypher    

    Gracias!, lo acabo de utilizar en mi site Guiño

    • Responder
    • Citar
    • Comentado:
  • Hector    

    Has hecho alguna prueba para buscar sobre archivos de texto, incluyendolos en una columna de mysql??

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    no sobre archivos de texto porque el full text search no funciona sobre un BLOB si no que solo sobre campos del tipo TEXT

    • Responder
    • Citar
    • Comentado:
  • Anónimo    

    Hola...me preguntaba si conoces alguna forma de hacer full text search pero en postgres, agradezco cualquier respuesta...!!!

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    encontré esto en PostgreSQL
    http://techdocs.postgresql.org/techdocs/fulltextindexing.php

    • Responder
    • Citar
    • Comentado:
  • Dani    

    Para cambiar el límite inferior de tamaño de las palabras basta con editar el fichero my.cnf y añadir la línea

    ft_min_word_len = 3 # longitud mínima de palabra: 3 caracteres


    Tras esto hay que re-crear el índice fulltext, lo que se consigue con

    REPAIR TABLE tabla QUICK;

    Más información en la documentación de MySQL.

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    ojo con eso, que cuanto más chica es la palabra mínima, más grande es el índice y más lenta la búsqueda, con el agravante de "violación de servidor" que te mandás en cada search Guiño

    • Responder
    • Citar
    • Comentado:
  • Maxi    

    Muy buen dato, Fabio, gracias mil, ya lo estoy implementando.

    • Responder
    • Citar
    • Comentado:
  • Jorge    

    Fabio;
    Has echo una consulta com mas de dos campos, por ejemplo
    $consulta=$db->Execute("SELECT * FROM $sql_usuarios WHERE MATCH(usuario, nombre, apellido, email, calle, descripcion) AGAINST (´$keys´)");
    Porque solamente me encuentra si existe un usuario, no me busca por los demas campos.
    Sabes que puedo estar haciendo mal?
    Gracias.

    • Responder
    • Citar
    • Comentado:
  • Alejandro    

    Hola esta bueno el buscador, una consulta.
    Suponete que quero buscar las ocurrencias de las palabras "php mysql", como hago para que solo me devuelva los registrso en los cuales estan las 2 palabras, y no 1 de las 2???? se puede???
    muchas gracias por tu ayuda.

    Alejandro

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Alejandro, ahí vas a tener que buscar en la ayuda de MySQL pero si, se que se puede con ciertos parámetros para indicar cómo querés que sea la búsqueda

    http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html

    • Responder
    • Citar
    • Comentado:
  • Hola Pablo. Permíteme felicitarte por esa contribución tuya tan importante a los que comenzamos a programar en PHP. Quisiera pedirte por favor, me indiques una manera de paginar los registros de un Select, tengo mi tabla clientes y desearia mostrarlo de 1 en 1 mediante el Clic a unas imagenes de Flechas ( |>, >>|). Gracias por tu ayudadita.
    Cordialmente: Luis Herrera, Ecuador

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Hola Puis :D ah, es que soy Fabio

    para paginar, en MySQL tienes la función Limit.

    limit 0 , 20 te mostrará, comenzando desde el registro 0 los primeros 20 resultadoos

    SELECT * FROM USUARIO LIMIT 0,20

    mostrará los primeros 20 usuarios, si el LIMIT es 20,20 mostrará los siguientes 20 y así.

    de esta forma es fácil hacer un paginador.

    • Responder
    • Citar
    • Comentado:
  • que tal favio :D
    mirad que yo ya he estado haciendo pruevas con lo que voz nos enseñas en este post, y como dices aun no tengo muy enclaro esto del mysql y lo de php, me gustaria si fueras un poco mas amable en explicarlo con mas piedritas para los que no le entendamos, a mi parecer no se si toy wey o algo me falta el buscador ya lo hice jalar pero no me busca nada no se si tenga que crear un indice en la base de datos o sabe.

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    jesus, el índice se crea, como explico en el texto, con esto: ALTER TABLE notas ADD FULLTEXT(titulo, cuerpo);

    • Responder
    • Citar
    • Comentado:
  • juank    

    Hola amigos,este codigo es muy bueno,nada q ver con el Like, pero quiero hacerles presente algo, un detalle del MATCH, cuando buscas en varios campos este MATCH toma prioridades x cada campo y no realiza una busqueda total en todos los campos y es x eso q a veces no encuentra un dato q supuestamente deberia encontrar en cierto campo, hagan sus pruebas y veran. Pero cual es la solucion.... pues deben crear un multicampo en MySQL q contenga todos los campos donde se realizara la busqueda, esto les da opcion a q solo busq un campo y no varios, al buscar un solo campo, ahi si realizara una busqueda completa.Ok. Bueno nos vemos y espero les ayude este dato. Bye.Guiño

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    gracias por el dato juank

    • Responder
    • Citar
    • Comentado:
  • gonso    

    Hola, yo solo quiero preguntar si en php hay alguna forma de sacar el valor de ´score´. Y otra preguntilla, si me podeis decir como cambiar el ft_min_word_len en windows, porque lo he intentado de mil formas y nada.
    Muchas gracias y muy bueno el articulo Guiño.

    • Responder
    • Citar
    • Comentado:
  • Mauricio    

    Hola, te felicito por el dato, ya que me ha ayudado en un sitio que estoy desarrollando. Pero tengo una consulta respecto del tema "Multicampos" que mensionó JuanK.
    He tenido el problema descrito por él, pero no he encontrado la forma de unir los campos. Supongo que es con un AS ????.
    Por favor si puedes aclarármelo...... Gracias.

    • Responder
    • Citar
    • Comentado:
  • Gladys    

    Hola
    Mi problema es el siguiente quiero realizar busquedas en jsp y mysqlfront lo que pasa que hago mi select y quiero unir con mas select pero en mysqlfront no hay la palabra o en comendo union y mis tablas que tengo estan relacionadas desde ya muchisimas gracias por la ayuda

    • Responder
    • Citar
    • Comentado:
  • Hola a todos, quería agradecerles a todos por esta muy buena solución y agregarle un detalle con respecto a la cantidad de palabras a buscar, yo esto lo solucioné con PHP de la sig. manera:
    $vector_palabras = explode(" ", $_POST);
    if (count($vector_palabras) == 1){
    $armo_select = "SELECT * FROM tabla WHERE campo1 LIKE ´%$vector_palabras%´ or campo2 LIKE ´%$vector_palabras%´ ORDER BY campon DESC";
    }
    else{
    $armo_select = "SELECT *, MATCH (campo1, campo2) AGAINST (´$_POST´) AS coincidencia FROM tabla WHERE MATCH (campo1, campo2) AGAINST (´$_POST´) ORDER BY coincidencia DESC";
    }
    $result = mysql_query("$armo_select");

    // creo que todos ya se dieron cuenta de o que hice, pero por si las brujas...
    Primero separo las palabras que se cargaron en el formulario con un EXPLODE() luego me fijo cuantas palabras separadas por espacio " " hay en lo que se cargó en el form. COUNT($array), si es 1 palabra hago un LIKE y si son más de una hago un MATCH.
    en el select del MATCH puse tambien un campo AS para ordenar la busqueda por coincidencias el orden que le dí es DESC, así coloca primero las de mayor coincidencia.

    Espero les siva como me sivio a mi..

    • Responder
    • Citar
    • Comentado:
  • Hola Fabio, muchas gracias muy útil.

    Una cosa, ¿para sacar el valor score una vez hecha la consulta? Como lo hago.

    Gracias de antemano

    • Responder
    • Citar
    • Comentado:
  • marcelo    

    holafabio un favor como hago para hacer busquedas sencillas donde se usen varios criterios juntos y separados

    • Responder
    • Citar
    • Comentado:
  • Que "muy bien" trabaja !
    Me solucionó muchos dias de pruebas y de busqueda en internet. de verdad es un gran aporte. Gracias!

    • Responder
    • Citar
    • Comentado:
  • kevin    

    :s
    nesecito llamar en php una base de datos y traerme los ultimos años de cada revista pero cada revista publica uno o dos numeros al año u cuando me la traigo por año pero me trae con el primer numero del año y no el ultimo.

    como hago para traerme el año pero con el ultimo numero en PHP y MySql

    • Responder
    • Citar
    • Comentado:
  • Carlos    

    Gracias justo lo andaba buscando

    • Responder
    • Citar
    • Comentado:
  • Pedro    

    Haciendo referencia al mensaje que anexo en la parte posterior de mi POST, he leido la ayuda de MySQL y no encuentro como hacerlo, alguna idea de como buscar las ocurrencias de las palabras ej: "php mysql"???, muchas gracias

    -------------------------------------------------
    Hola esta bueno el buscador, una consulta.
    Suponete que quero buscar las ocurrencias de las palabras "php mysql", como hago para que solo me devuelva los registrso en los cuales estan las 2 palabras, y no 1 de las 2???? se puede???
    muchas gracias por tu ayuda.

    Alejandro

    <a href></a><a href></a><img src><img src><a href></a>Guiño<a href></a><a href></a><a href></a><a href></a>

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Pedro, no creo que lo puedas resolver con Full Text Search, si no con el viejo Like

    select * from pepito where texto like ´%php%´ AND texto like ´%mysql%´

    la condición AND obliga a que se den ambas coincidencias, pero el uso de like %% hace que sea muy lenta e ineficiente la búsqueda.

    • Responder
    • Citar
    • Comentado:
  • obokaman    

    Sí que es posible conseguirlo, Alejandro. Full Text incorpora operadores lógicos que puedes añadir a las palabras usando el modo el BOOLEAN MODE. Puedes añadir un símbolo "+" antes de cada palabra para forzar que la encuentre, o un * como comodín, p.e. Encontrarás más referencias en la documentación de Mysql.

    • Responder
    • Citar
    • Comentado:
  • Me he identificado con el tema, estoy estudiando en la universidad y mi trabajo final de curso trata sobre esto, simular un buscador en ftps, es decir indexo todos los ficheros y directorios de los ftps de la red en una base de datos y luego solo seria implementar un buscador para esa base de datos. Mi pregunta es la siguiente: que tal si la consulta que necesito hacer a mi base de datos requiere acceder a informacion de varias tablas y no a una solo como en todos los ejemplos que he encontrado del tema? Que tal si dentro de la clausula where necesito chequear otras cosas, por ejemplo que un campo de la tabla1 coinsida con uno de la tabla2.
    Por otra parte si alguien me pudiera ayudar en esto, es que necesito una funcion php que me permita saber de un ftp sus directorios y ficheros. He usado la funcion ftp_rawlist, pero para todos los ftp no funciona de la misma forma. Ya he implementado mi biscador con el Like, pero cuando especifico cadenas modelos de mas de 4 o mas caracteres, por ejemplo:%acrob% no me devuelve ningun resultado, existiendo en la BD elementos que cumplen el criterio. Lo mismo sucede si especifico un elemento sin caracteres especiales como el %, sencillamente el nombre, en este caso se supone el Like funcione como un =, pero en mi caso no, no se por qué?

    • Responder
    • Citar
    • Comentado:
  • ruben    

    Muchas gracias fabio.
    me has ayudado muchisimo

    • Responder
    • Citar
    • Comentado:
  • Hectorweb    

    Hola.. algien me puede decir o explicar detalladamente como hago una encuesta en php con mysql.
    como hago referencias(foren key) en mysql usando php?

    • Responder
    • Citar
    • Comentado:
  • Hola, he utilizado las instrucciones que ponen aqui y me resulta cuando ago la busqueda de una sola palabra, pero para 2 o mas no me genera ningun resultado. Les agradeceria si me pudieran ayudar, este es el codigo:

    • Responder
    • Citar
    • Comentado:
  • Creo que ingrese mal el codigo


    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Karlos Hill:

    tendrás que buscar más en la ayuda de MySQL yo lo uso poco y por lo general si me da resultados para más de una palabra

    • Responder
    • Citar
    • Comentado:
  • elvis    

    <strong> HOLA AMIGOS ME PODRIAN AYUDAR EN PROGRAMAR UN BUSCADOR EN PHP PARA BUSCAR INFORMACION EN BD EN MYSQL SON VARIAS TABLAS . DESDE YA AGRADEZCO SU AYUDA . ELVIS </strong>

    • Responder
    • Citar
    • Comentado:
  • Luchi    

    Estoy con un problemita, no puedo hacer funcionar esto. Alguien me puede dar un consejo.
    Aca les paso el código

    ´´){


    $result = mysql_query("SELECT nombreEmpresa, MATCH(nombreEmpresa) AGAINST (´%$busqueda%´) as Score FROM empresas WHERE MATCH(nombreEmpresa) AGAINST (´%$busqueda%´) ORDER BY Score DESC LIMIT 0,20
    ; ", $link);

    echo " Empresa:".mysql_result($result, 0, "nombreEmpresa")."<br>";
    } else {

    echo " Busqueda es vacia"

    }
    endif;
    ?> <strong></strong><em></em>

    • Responder
    • Citar
    • Comentado:
  • Luchi    

    No se copio bien el codigo aca se los mando

    ´´){

    ALTER TABLE empresas ADD FULLTEXT(nombreEmpresa);
    $result = mysql_query("SELECT nombreEmpresa, MATCH(nombreEmpresa) AGAINST (´%$busqueda%´) as Score FROM empresas WHERE MATCH(nombreEmpresa) AGAINST (´%$busqueda%´) ORDER BY Score DESC LIMIT 0,20
    ; ", $link);

    echo " Empresa:".mysql_result($result, 0, "nombreEmpresa")."<br>";
    } else {

    echo " Busqueda es vacia"

    }
    endif;
    ?>

    • Responder
    • Citar
    • Comentado:
  • vane    

    hola fabio por favor borra el comentario de luis, es un compañero de clases y por accidente tomo mi codigo y no quiero que tenga acceso a mi base de datos te lo pido por favor $conexion = mysql_connect(*******); si lo ve mi jefe es capaz y me bota

    • Responder
    • Citar
    • Comentado:
  • Fender    

    Podrina mandarme los Codigo De Fuente a mi email del Buscador lo nececito Gracias, mi email es jansel_gt@hotmail.comGuiño

    • Responder
    • Citar
    • Comentado:
  • vane    

    fabio mil gracias de verdad me has salvado Guiño

    • Responder
    • Citar
    • Comentado:
  • Camila    

    Alguien podría decirme desde que versión Mysql soporta los fulltext

    • Responder
    • Citar
    • Comentado:
  • Albert    

    Sin crear el indice, esto funciona? Es que lo que se arregla con hacer el buscador, se estropea por el otro lado creando el indice, ya que haze que todo vaya lento :s

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    ¿lento? si ese índice hace que funcione lento el problema es otro, ¿sobre que plataforma está ese mysql? teniendo en cuenta que el índice se crea una vez y se agranda solamente cuando se agrega un registro en esa tabla, no debería ser lento, todo lo contrario, este índice es para hacerlo más rápido.

    ahora bien, si el server mysql corre en un Pentium de 200Mhz con 32Mb de RAM el problema es el hardware, no el índice! :D

    • Responder
    • Citar
    • Comentado:
  • dani    

    Hola estoy haciendo un filtro para filtrar palabras fuera de tono...

    Pero tengo un problema mi filtro ya filtra si alguien pone capullo pero no si para burlar al filtro pone uncapullo todo junto... alguna idea?

    Gracias de antemano

    • Responder
    • Citar
    • Comentado:
  • Jorgedx    

    A Luchi
    creo q te falta un ; en el ultimo echo
    le eche un ojo asi no mas :P


    cita:
    ******************************************************
    No se copio bien el codigo aca se los mando

    ´´){

    ALTER TABLE empresas ADD FULLTEXT(nombreEmpresa);
    $result = mysql_query("SELECT nombreEmpresa, MATCH(nombreEmpresa) AGAINST (´%$busqueda%´) as Score FROM empresas WHERE MATCH(nombreEmpresa) AGAINST (´%$busqueda%´) ORDER BY Score DESC LIMIT 0,20
    ; ", $link);

    echo " Empresa:".mysql_result($result, 0, "nombreEmpresa")."
    ";
    } else {

    echo " Busqueda es vacia"

    }
    endif;
    ?>

    • Responder
    • Citar
    • Comentado:
  • jorgedx    

    hola
    cuandom hago una consulta me da este error


    //-*-*-*consulta SQL: Documentación-*-*-*

    SELECT * ,
    MATCH (
    usuario, apellidos
    )
    AGAINST (
    ´palabra´
    ) AS Score
    FROM fotos
    WHERE MATCH (
    usuario, apellidos
    )
    AGAINST (
    ´palabra´
    )
    ORDER BY Score DESC
    LIMIT 0 , 30

    MySQL ha dicho: Documentación
    #1191 - Can´t find FULLTEXT index matching the column list

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    te está indicando que nunca creaste el índice, te falta el ALTER TABLE para modificar la estructura y agregarle el índice full text

    • Responder
    • Citar
    • Comentado:
  • jorgedx    

    jaja si lo hice!!!
    y me sigue tirando ese error!

    gracias por responder!

    • Responder
    • Citar
    • Comentado:
  • Christian    

    MUchísimas gracas por el tutorial, el FULLTEXT ni figuraba en mis libros.
    Excelente!!:D

    • Responder
    • Citar
    • Comentado:
  • JAD    

    A ver a ver, para los que quieren buscar varias palabras en un campo y q coincidan todas (ej: "mysql php") solo tienen q encerrar entre comilla simples y luego dobles lo q desean buscar (ej: ´ " mysql php" ´ y ahi tendran el resultado exacto, esto prueben en la base y veran q todo va bien ...ahora si desean hacerlo desde php con un campo de busqueda ahi es otra cosa o sea mas o menos de esta forma:
    la palabra a buscar la ponen entre comillas en la barra de busqueda(ej: "mysql php ") y en el codigo d busq queda asi -- AGAINST(´" . stripslashes (str_replace (""", """,$var_busq)) . "´--

    • Responder
    • Citar
    • Comentado:
  • Para hacer busqueda de dos palabras en una misma columna tienes que usar los conectores booleanos ejemplo +palabra1 +palabra 2 o bien para encontrarlas exactamente puedes usar "palabra1 palabra2"

    mira http://www.phpfreaks.com/tutorials/129/0.php

    • Responder
    • Citar
    • Comentado:
  • Christian    

    Muy bueno el código, gracias por el aporte.
    Una consulta, que no me parece muy complicada, pero no doy con el clavo para solucionarla.
    El editor carga notas en la tabla correspondiente desde un frontend, por ej. la palabra "apícola".
    Luego al procesarse, finalmente se almacena "apícola" en la tabla.

    El problema es que los usuarios no utilizan acentos en sus busquedas, y por ello no se devuelven resultados en las busquedas al no encontrar incidencias.

    Como hago para que se se busque una palabra sin acento, y se devuelvan los resultados CON y SIN mayuscluas almacenados.
    parte de mi codigo:

    $query_search= ´SELECT * FROM tb_empresa_textos WHERE MATCH(empresa_texto_descripcion, empresa_texto_desc_comercial ) AGAINST ("´.$palabra.´")´;

    GRACIAS y Espero su ayuda

    • Responder
    • Citar
    • Comentado:
  • RODRIGO    

    estube leyendo su sitio y la verdad me parecio muy interesante, yo neceisto realizar un buscador dentrode mi sitio de dreamweaver tu podrias ayudarme

    • Responder
    • Citar
    • Comentado:
  • Jack    

    Alguien puede decirme como hacer una consulta para conectar conectar varias tablas usando mysql y php, los parametros de la cosulta son $idrubro, $idsubrubro y $idempresa, pertenecientes a las tablas rubro, subrubro y empresa respectivamente.

    • Responder
    • Citar
    • Comentado:
  • Jack    

    me olvidaba los campos de las tablas son:
    rubro{idrubro(PK), descripcion}
    subrubro{idsubrubro(PK), idrubro(FK), descripcion}
    empresa{idempresa, nombre empresa, idrubro(FK), idsubrubro(FK)}
    los campos que voy a mostrar son rubro.descripcion, subrubro.descripcion, empresa.nombre_empresa

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Jack, te recomiendo que busques un tutorial de SQL y revises la parte de "JOINS"

    en la sección de descargas de este site tenés uno sencillo, <a href="http://www.fabio.com.ar/descargas.php?id_descarga=13&id_categoria_descarga=2">click aquí</a>

    • Responder
    • Citar
    • Comentado:
  • skropper    

    En primer lugar, gracias fabio por la data que es muy bueno, el problema que tengo que cuando busco numeros, por ejemplo ´6000´ no los encuentra, sera que eh hecho algo mal?
    Desde ya gracias

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    skropper

    el problema está, seguramente, en el tamaño mínimo de palabra que busca. Eso se configura en el MySQL y es un problema clásico del Full Text Search ya que por lo general indexa palabras de más de 3 caracteres, y en algunos casos está configurado para más de 4. 6000 tiene 4 caracteres, puede que no esté indexado.

    hay una variable en la configuración de mysql que es:

    ft_min_word_len=3

    el valor es el que modifica esta propiedad, cuanto más chico más "lento" y grande el índice, así que ojo y cuidado porque puede traer problemas

    • Responder
    • Citar
    • Comentado:
  • skropper    

    querido fabio segui tu recomendacion de agrandar el ft_min_word_len a 3 pero sigo teniendo el mismo problema, si por ejemplo pongo ´03.04.05´ o ´06/05´ no sale nada si en cambio cuando pongo solo texto.
    gracias y disculpen las molestias.

    • Responder
    • Citar
    • Comentado:
  • Rodpat    

    Hola que tal, espero se encuentre muy bien....

    Quisiera saber si tienen algun ejemplo de como subir archivos desde un formulario y luego poder bajarlos cuando sea necesario ... soy nuevo en esto del php y espero que me entiendan

    muchas gracias

    • Responder
    • Citar
    • Comentado:
  • Martun    

    Gracias Fabio!!!! Muy bueno el articulo. Tenia hecho un buscador con LIKE que daba lastima...
    Saludos

    Martun

    • Responder
    • Citar
    • Comentado:
  • Hola

    Excelente artículo, hace bastante tiempo que leo tu blogm y e sla primera vez que poesteo. Me asaltan algunas dudas, que espero poder solucionar, pero las dejaré como inquietud.

    1.- Me imagino que al crear un nuevo indice, estamos agregando información extra a la base de datos, consideremos que esta base de datos crece exponencialmente, como será el costo de agregar un nuevo índice (fuera de los que estan por el modelo que aplicamos).
    2.- El tiempo de busqueda en una tabla de 10 registro no es el mismo que en una con 10millones. Me gustaria investigar mas sobre ese aspecto.
    3.- Hasta el momento solamente se mencionan ventajas al realizar este método de busqueda, consideremos que todo tiene desventajas, cuales serian estas
    4.- Generalmente, las bases de datos, no tienen una o dos tablas, generalmente tienen 5 como mínimo, donde estas 5 almacenan datos ( no consideremos las tablas de referencia, que por sí no necesitan mucha busqueda) se tendria que realizar una busqueda para cada tabla.. o se pueden generar Joins para usar el mecanismo mencionado anteriormente
    5.- COn respecto a la pregunta anterior.. como realizo los joins con tablas referenciales ?? por ejemplo, si tenemos una tabla EMPLEADO, y en la otra CARGO, y queremos que busque en todos los empleados que tienen cargo administrador, jefe o secretaria... no vale hacer la busqueda por el Identificador del cargo. (Quizas esta búsqueda quedaria mejor con joins, pero es un ejemplo)

    Eso se me ocurre por el momento, espero todos los comentarios

    Saludos

    Jotamachuca

    • Responder
    • Citar
    • Comentado:
  • Se me olvidó un pequeño gran detalle :-)

    Los acentos.. dependiendo de la configuración regional del server, de la base de datos, de los datos, del cliente, dependeran muchas de nuestras búsquedas.

    Imaginemos el siguiente supuesto. Ingreso un artículo, donde la palabra principal es iniciación (con acento). El motor lo guarda (por seguridad ante el cambio) como iniciación, pero por un bug en el campo nombre se guarda tal cual. Supongamos tambien, que por una mala configuración del los caracteres locales (puede pasar), se guarda en el campo nombre como "iniciación", pero el acento de la o, se guarda como ... cualquier cosa.

    Ahora cuando realizo las búsquedas.. como se podria optimizar esto, de manera de encontrar este artículo ???

    a) Cambiar todos los acentos, independiente del campo que sea
    b) Eliminar todos los acentos
    c) Este tio sta loko y nunca tendré ese problema, asi que todo lo que escribió es paja molida :-)

    Eso :-)

    Saludos !!!

    Jotamachuca

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Jotamachuca: vamos por partes :D

    1.- tal cual, crece exponencialmente el espacio usado en la DB
    2.- es obvio eso, pero también depende del motor de base de datos y el tipo de tabla (ej: InnoDB, MyISAM) creo que en la web de MySQL se explica un poco mejor cual sirve para cantidades de millones.
    3.- las desventajas, creo que nombro alguna arriba, están en el tamaño de la búsqueda: si está configurado a 4 caracteres no podés buscar palabras más chicas, si tenés una de 3, por ejemplo FTP no te la va a encontrar nunca porque la palabra menor es de 4 letras.
    4.- los joins sólo si vas a buscar en texto, este tipo de búsqueda: FULL TEXT SEARCH, es para texto! no para buscar algo que fácilmente podrías desplegar en un combo.
    5.- más o menos lo mismo que lo anterior. Si buscás por el apellido del empleado usás el FULL TEXT pero para el campo que define el cargo (que por lo general es una cantidad limitada) te conviene hacer un combo y el join lo hacés por un ID en particular. ¿quien buscaría el cargo tratando de adivinar? no tipearías "carlos perez, gerente", lo último lo buscás en un combo y listo.
    6.- para los acentos recomiendan usar UTF-8 así lo puede ver cualquier motor en cualquier idioma, yo todavía uso ISO. Igualmente no he leído la documentación de MySQL a full como para saber cómo resuelve el tema de los acentos y si los pasa a "sin acento" como hace Google, no creo que sea tan complejo MySQL 5 ya no lo sé.

    • Responder
    • Citar
    • Comentado:
  • Maritza    

    Hola:
    Bueno estoy haciendo un sistema en el cual debo de hacer uan busqueda, puede que sea po un asolapalabra o por fecha, encontre un ejemplo en esta direccion www.programacion.com pero tengo un problema es qu mi mysql que estoy utilizando es el 4.1 y no me dejar utilizar el fulltext asi que o se uqe onda si me pueden aydar se los agradeceria mucho.:s

    • Responder
    • Citar
    • Comentado:
  • Maritza    

    Disculpen mis faltas de otografia, y todo lo que me de la busqueda se debe de poner en una tabla con scrollbar
    Gracias

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Maritza, el MySQL 4.1 soporta perfectamente Full Text Search. Lo que puede suceder es que no esté habilitado en tu servidor, pero desde la versión 4.0 funciona perfecto incluyendo 4.0, 4.1 y 5.0

    • Responder
    • Citar
    • Comentado:
  • Maritza    

    Me podrias decir en donde lo habilito porfavor?:sPor que he preguntado y no mas nop, gracias.

    • Responder
    • Citar
    • Comentado:
  • Maritza    

    Oye he leido que no se puede el fulltext para campos BLOB y como se le haria para sacarlos dela based edatos en un abusqueda?

    • Responder
    • Citar
    • Comentado:
  • Hola

    Gracias Fabio por responder... te cuento que tengo una tabla con 1millon de registros , en el cual metí texto y basuras varias para hacer pruebas... espero escribir un documento como hice eso, para que sirva a alguien mas.

    Con respecto al punto de la integridad que puse y las llaves foraneas y toda esa vaina :-), creo que no me entendiste mucho :-(...

    Estoy claro que la busqueda si se a que corresponde, seria mejor con un combo... yo pensaba en un nivel superior. Consideremos que tengo 3 tipos de contenidos distinto que deseo consultar.

    Noticias (ID_NOTICIA, ID_TIPO_NOTICIA, TITULO, NOTICIA)
    Articulos (ID_ARTICULO, ID_TIPO_ARTICULO, TITULO, ARTICULO, ENLACE, OTRO)
    Publicaciones (ID_PUBLICACION, TITULO, ID_AUTOR, ID_TIPO_PUBLICACION, RESUMEN, PUBLICACION).

    Y donde ID_TIPO_NOTICIA, ID_TIPO_ARTICULO, ID_AUTOR, ID_TIPO_PUBLICACION son las llaves foraneas de tablas referenciales y poseen la siguiente estructura

    TIPO_**** (ID_TIPO_**** , NOMBRE_TIPO_*****)

    (Es solo un ejemplo, se que esto puede mejorarse, pero no nos coloquemos quisquillosos)

    SI en tipo de noticia aparece "Base de datos" y tengo un articulo que tiene por titulo "base de datos" , y una publicacion de tipo "Base de Datos" ... como hago la busqueda????

    Ahora me entiendes???? Si justo se da la casualidad, que en estos tres contenidos no mencionno la palabra "Base de Datos" , pero si estan relacionados en sus tablas referenciales.. y coloco al buscar "Base de Datos"... se estan perdiendo 3 articulos distintos (1 noticia, 1 articulo, 1 publicacion), siendo quizas que esas son las que justo necesitaba :-(

    Espero que me entiendas mi comentario.. ese es el punto ..

    COn respecto al rendimiento veré que onda con el millon de registros, aca te presento la estructura del cuento.
    mysql> describe ARTICULO;
    +-------------+--------------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +-------------+--------------+------+-----+---------+----------------+
    | ID_ARTICULO | int(11) | | PRI | NULL | auto_increment |
    | ID_TIPO | int(11) | | | 0 | |
    | NOMBRE | varchar(255) | YES | MUL | NULL | |
    | ARTICULO | text | YES | | NULL | |
    | CREACION | date | YES | | NULL | |
    | ESTADO | char(1) | YES | | NULL | |
    | VISITA | int(10) | YES | | NULL | |
    +-------------+--------------+------+-----+---------+----------------+

    Para maritza, quizas estos links te sirvan

    http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
    http://www.zend.com/zend/tut/tutorial-ferrara1.php
    http://www.mysql-hispano.org/page.php?id=15

    Saludos a todos...


    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Jotamachuca, una idea que se me ocurre es que realices tres búsquedas unidas por "UNION", en MySQL 5 es más fácil gracias a los stored procedures , pero aún en 4 o 4.1 se puede hacer.

    sí o sí son tres consultas si querés que lo haga bien y sea más manejable. porque cada una tendrá su propio índice y sus propios problemas.

    cuando mostrás los resultados los armás en una misma tabla para que parezcan de una misma consulta.

    en esa tabla y con un millón de artículos, si la idea es usar full text search, será lento sin dudas, pero más rápido que sin índice.

    de hecho, en el weblog está hecho así actualmente, por eso el límite del tamaño de palabra es necesario para utilizarlo.

    • Responder
    • Citar
    • Comentado:
  • Lo de la UNION lo habia pensado,... el asunto es que no se me ocurre como hacer lo de las tablas foraneas..

    En el ejemplo cuando haga la busqueda por noticias, la tupla tendria un aspecto así...

    ID_NOTIICIA | ID_TIPO_NOTICIA | NOTICIA
    1 | 1 | Primera Noticia

    y en la tabla TIPO_NOTICIA
    ID_TIPO_NOTICIA | TIPO_NOTICIA
    1 | Base de Datos

    La transformación del 1 de la tabla NOTICIA a que asuma que es Base de Datos es la complicación :-)

    Se me ocurre algo asi (OJOOOOO Estoy escribiendo lo que pienso.. apuesto mi craneo a que este query no resulta )

    SELECT *
    FROM NOTICIA , TIPO_NOTICIA
    WHERE NOTICIA.ID_TIPO_NOTICIA = TIPO_NOTICIA.ID_TIPO_NOTICIA
    AND MATCH( TIPO_NOTICIA, NOTICIA ) AGAINST (´Base de Datos´)
    ORDER BY Score DESC

    Esop... bueno, hasta ahora no he investigado sobre eso... pero por lo que veo, se que me traerá problema :-)

    Gracias por responder, y ocupar tu tiempo y tu espacio

    • Responder
    • Citar
    • Comentado:
  • Maritza    

    Gracias Jotamachuca por las direcciones , ya me salio mi busqueda, y pues a ver que otra cosa me piden , gracias

    • Responder
    • Citar
    • Comentado:
  • Hola, Felices fiestas!!!

    • Responder
    • Citar
    • Comentado:
  • Hola, Felices fiestas!!! Alguien me podria ayudar a aprender a crear bases de datos con SQL o algo por el estilo? Estoi aprendiendo a programar en PHP, gracias...!!!

    • Responder
    • Citar
    • Comentado:
  • diego    

    muy groso fabio felicitaciones

    • Responder
    • Citar
    • Comentado:
  • Joaisy    

    hola me parece muy buena la informacion q dan me parece muy clara y entendible hasta para mi q no soy muy buena en eso
    Ahora quisiera saber si me pueden ayudar con eliminar estoy viendo php y ya vamos por el buscador y se parece mucho a lo q esta explicado en la pagina ahora nos mandaron hacer el Eliminar <strong></strong> y no se como hacerlo si me pueden ayudar se los agradeceria. Gracias!.

    • Responder
    • Citar
    • Comentado:
  • Joaisy    

    la profesora nos explico el buscador con Like

    • Responder
    • Citar
    • Comentado:
  • <strong>Hola...!!!</strong> Alguien me podria aiudar kon este error porfavor???:
    Error al ejecutar consulta: The used table type doesn´t support FULLTEXT indexes

    se ke dice ke ke no soporta el FULLTEXT, pero si pudes aiudarme a hacer ke lo soporte o ke puedo hacer ia ke he utilizado los ejemplos ke aki ponen para aprender un poko i solo este kodigo no me a funcionado!!! aiudaaaa , gracias...!!! Guiño

    • Responder
    • Citar
    • Comentado:
  • Hola a todos

    Un punto que no habia considerado.. o que no he visto, es el tamaño adicional que se incluye en la tabla al crear este índice FULLTEXT......

    Por que hablo de esto.. simple

    Para probvar los ejemplos creé una tabla con un número considerable de registros ( 826.401para ser mas exactos), de los cuales la tabla tiene la sig. estructura
    +-------------+--------------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +-------------+--------------+------+-----+---------+----------------+
    | ID_ARTICULO | int(11) | | PRI | NULL | auto_increment |
    | ID_TIPO | int(11) | | | 0 | |
    | NOMBRE | varchar(255) | YES | | NULL | |
    | ARTICULO | text | YES | | NULL | |
    | CREACION | date | YES | | NULL | |
    | ESTADO | char(1) | YES | | NULL | |
    | VISITA | int(10) | YES | | NULL | |
    +-------------+--------------+------+-----+---------+----------------+

    Cual es el punto.. a la tabla se le creó el índice en los campos NOMBRE y ARTICULO... cual fue mi sorpresa al ver que la tabla creció de un tamaño 573.3 MB a uno de 1.6G app. ... o sea el indice FULLTEXT adiciono 850megas de pura estructura.... jejejeje

    Creo que es un punto a considerar.. cuando se tienen tablas con bastantes datos.. para prevenir el crecimiento y quedar sin espacio.. aunque en la actualidad por el valor de los discos duros..

    Esop

    Seguiré investigando

    Saludos

    • Responder
    • Citar
    • Comentado:
  • Daniel    

    Muy bueno, aunque lamentablemente para hacer algo mas efectivo y que sirva para hacer realmente un script que sea útil haya que combinar el LIKE con las FULLTEXT, pero bueno, a lo mejor en un futuro no muy lejano nos quitan complicaciones mejorando estos aspectos.
    Saludos.

    • Responder
    • Citar
    • Comentado:
  • Leugim    

    Amigos una pregunta?

    Quien de ustedes "a logrado" paginar los resultados de este tipo de consulta FULLTEXT de esta manera :

    3</strong> 4 5 6 7 SIGUIENTES>>

    Sera que hay alguna persona que lo aya logrado?

    Yo nunca e tenido problema para paginar resultados de busquedas sencillas.. pero esta FULL TEXT, vaya que me a estado reventando la cabeza...

    Gracias y Saludos.-

    • Responder
    • Citar
    • Comentado:
  • Kakyo    

    Lex Castillo, el problema que tenés es porque FULLTEXT está soportado solamente para tablas definidas como MyISAM, no hay soporte para InoDB todavía.
    Acá paso el link con el reporte de bug en la página de mysql que explica esto:
    http://bugs.mysql.com/bug.php?id=6713

    • Responder
    • Citar
    • Comentado:
  • MERCEDES    

    hola buen dia

    me gustaria que me sacaran de mi duda
    yo tengo una pagina la cual quiero implementar un buscador para buscar articulos que se encuentran en las paginas, los articulos no se encuentran en un a base de datos solo en la pagina como le puedo hace me sirve esto.

    • Responder
    • Citar
    • Comentado:
  • Leo    

    Hola, haber si alguien me puede ayudar con esto, que me quibra la cabeza desde hace dias....
    necesito hacer una busqueda pero de varias palabras en distintos campos.
    por ejemplo, tengo la tabla
    nombre| edad |apellido
    --------------------------
    dato1 dato2 dato3
    dato5 dato2 dato3
    dato1 dato2 dato3
    dato1 dato2 dato3

    Nesicito hacer que una busqueda me arroje todos los registros que cumplan con cada uno de los criterios.
    Si yo buscara por nombre=dato y edad=dato2 y apellido=dato3
    me entregara esto:
    dato1 dato2 dato3
    dato1 dato2 dato3
    dato1 dato2 dato3

    Alguien tiene alguna idea de esto??...como lo puedo hacer?..

    Eso, desde ya muchas gracias.

    P.D.:favio, buenisimo el articulo.

    Saludos, Leo.


    • Responder
    • Citar
    • Comentado:
  • steven    

    como se hace una consulta de la sgte forma:
    al presionar la tecla tab o pasar de un text a otro ejecutar una conculta con codigo PHP

    • Responder
    • Citar
    • Comentado:
  • steven    

    ????ejecutar una consulta al press tab, osea pasar de un text a otro.



    ??????????????????????????????????????

    • Responder
    • Citar
    • Comentado:
  • Matias    

    He utilizado el buscador y me ha funcionado casi al 100% a no ser porque yo en el formulario de busqueda agregue un select donde se elige en que campo realizar la busqueda. Estos campos son de la misma tabla y yo lo envio junto al valor del campo busqueda desde una pagina x.php a buscar.php. Necesito saber donde colocar el valor que me da el select.
    Si alguien pudiera ayudarme... muchisimas gracias.
    Matias

    • Responder
    • Citar
    • Comentado:
  • me encuentro con el preblema q habia comentado juanK en el mensaje 18; de eso ya hace algún tiempo pero..podría explicarme alguien por favor el tema del multicampo??
    esq me realiza la buskeda pero no de forma completa, hay datos q no me los encuentra y debería...Sabe alguien como puedo solucionarlo??
    Gracias

    • Responder
    • Citar
    • Comentado:
  • jhony    

    Shhhh !

    • Responder
    • Citar
    • Comentado:
  • hiphop    

    Esto es lo que utiliza google para su buscador?

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    no, Google utiliza otros métodos más complejos

    • Responder
    • Citar
    • Comentado:
  • Christian    

    mysql se vuelve muy lenta cuando intento realizar la siguiente consulta:

    SELECT * FROM (Fecha RIGHT JOIN objetivos ON (fecha.Mes = objetivos.mes) AND (fecha.Ano = objetivos.ano) ) LEFT JOIN Facturacion ON objetivos.codigo = facturacion.codigo where facturacion.tipo 9 "
    luego de un tiempo prolongado me arroja el resultado, pero tarda muchisimo, tenes idea que puede pasar??. Yo he probado el mismo sql en Acces y anda rapidisimo

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    Christian, dudo que Access sea una base de datos :D, el problema, sin dudas, lo tenés porque no estás usando índices y estás haciendo un right join combinado con un left join, sumado a un * en el select. es medio rara tu consulta, el from fecha para joinear con objetivos, no sería mejor hacer el select de objetivos, join fecha join facturacion? pensá que para un right+left join hace producto cartesiano de las tablas, es una bestialidad...

    • Responder
    • Citar
    • Comentado:
  • Alvaro    

    fabio felicidades por tu articulo me ha ayudado muchisimo, pero tengo otro problema y espero que me ayudees.
    estoy haciendo una busqueda de archivos lo que hago es que un usuario mande cualquier archivo al servidor para despues consultarlo, entonces tengo una base en mysql en donde guarda el nombre del archivo , para despues consultarla y asi poder hacer el link a ese archivo.
    ya funciona pero cuando los nombres de archivos tiene acentos ocurre algo raro .simplemente no funciona que podria ser?¿

    • Responder
    • Citar
    • Comentado:
  • Jorge    

    Hola, una consultilla si puede ser...

    Tengo una base de datos en la que guardo palabras con y sin acentos. El problema es que al querer hacer busquedas en la base de datos de palabras con acentos, si la palabra esta con acento y sin acento en la base de datos, me devuleve las dos, en lugar de 1.

    ¿Como puede solucionarse?

    Un saludo

    • Responder
    • Citar
    • Comentado:
  • noemy    

    Buenas al leer esta información que me parece buenisima; ya que yo estoy en busqueda de información porque tengo que realizar una busqueda de unos expedientes pdf que tengo primero que digitalizar esto para crear un sistema de archivo para buscarlo mediante la cedula pero no se como realizarlo y se me a convertido en un obstáculo. Le agraceria una pronta ayuda... gracias

    • Responder
    • Citar
    • Comentado:
  • Margarita    

    Hola; tengo un problema, estoy realizando un directorio, necesito poder buscar por ejemplo los datos de las empresas de una ciudad, tengo un buscador este me llama un archivo que me muestra la informacion, inclui el paginador, pero este me funciona solamente en la primera pagina, cuando le solicito ver la pagina siguiente no me muestra ningun dato. ( Basicamente necesito saber como hago esta paginacion) Gracias

    • Responder
    • Citar
    • Comentado:
  • Disaster    

    Excelente trabajo. Tengo una duda que ya se habia planteado, es solo que eh buscado por todos los rincones de google y nomas no encuentro la respuesta.
    Es acerca de los acentos, ke en el post 67 tu pones: <em>"Igualmente no he leído la documentación de MySQL a full como para saber cómo resuelve el tema de los acentos y si los pasa a "sin acento" como hace Google, no creo que sea tan complejo MySQL 5 ya no lo sé."</em>
    Alguien ya lo a leído a full este script que sepa como hacerlo?.
    Solamente encuentro códigos php y necesitaría mysql puesto que asi es la base de datos y cambiarle a UTF no es una opción.
    Gracias

    • Responder
    • Citar
    • Comentado:
  • Disaster    

    oh ya, ay una funcion que se llama Replace, en la que se le agrega la letra que se va a remplazar dependiendo de la base de datos. o sease ´í´,´i´ en caso de buscar Rodríguez.

    Por si a alguien le interesa, por ahi va la idea

    • Responder
    • Citar
    • Comentado:
  • m0m0    

    hola... muy util la informacion... una pregunta: estoy haciendo un buscador por keywords para una biblioteca, asi que debo anexar a cada item de la base de datos (libros) los distintos tags que vendrian siendo las unidades de sus indices... la pregunta es... donde deberia ubicar esto dentro de la base de datos? sera que si creo un campo llamado keywords y separo las palabras por comas, la busqueda MySQL las tomara como palabras diferentes? o como una gran frase? espero que me puedan responder pronto porque esto es de mi tesis de grado =/ gracias

    • Responder
    • Citar
    • Comentado:
  • oye Fabio o a cualquiera de mis hermanos por ahi me podrian facilitar el sistema de Búsqueda con la BD y el Indice porfavor se lo agradecere mucho

    • Responder
    • Citar
    • Comentado:
  • hola desearia saber como hacer para buscar o en contrarel numero de dni con el nombre completo de la persona es urgente por fabor gracias o si hay algun programita para hacerlo atte noelia

    • Responder
    • Citar
    • Comentado:
  • TUADMIN    

    bueno amigo muy buen a la explicacion pero bueno jeje pero hice que el INUTIL de LIKE busque frases jejej y estaba ahciendo prueba y el LIKE me encuentra los resultados muy rapidos el triple mas que el MATCH ya que hice las pruebas con una base de datos con mas de 18470 registros

    pero bueno solo les queria decir que para que algo haga algo solos e necesita un poco de inventiva jejej bueno mejor le quito la grasa a l script para que sea rapido entendible y en español

    • Responder
    • Citar
    • Comentado:
  • nemo    

    Bueno de antemano muchas gracias por la ayuda, pero estoy teniendo un problema...en algunas tablas de mi bd funciona muy bien con campos text y varchar...pero en otras no...no se si es la cantidad de campos o el tipo de campo....porque le hecho es que no devuelve ningun error...pero tampoco arroja los resultados que debe arrojar de hecho no bota ningun resultado si me puedes explicare porque pasa esto te lo gradezco.

    • Responder
    • Citar
    • Comentado:
  • german    

    Hola cordial saludo y feliz 2007,
    tengo un problema con el siguiente codigo

    While($row=mysql_fetch_object($result))

    al hacer una busqueda me da como resultado esto:
    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in c:appservwwwesultado-buscar.php on line 169

    • Responder
    • Citar
    • Comentado:
  • jose luis    

    hola a todos nesecito ayuda para crear un procedimiento almacenado en mysql este es mi procedimiento:

    delimiter //
    create procedure sp_procedimi(in des varchar(30))
    begin
    select*from tabla where descrip like des+´%´;
    end;
    //

    pero sale error espero me ayuden
    mi correo es Strike_con@hotmail.com<strong></strong><strong></strong><a href></a>

    • Responder
    • Citar
    • Comentado:
  • Chapi    

    Buenisimo! Acabo de comprobarlo, hago click y el resultado aparece al toque!!

    saludos

    • Responder
    • Citar
    • Comentado:
  • Loco! que man tan teso como decimos en Colombia, mira, el score lo que hace es calcular qué resultados son los más acertados y los ennumera de mayor a menor, es decir, si buscas "la fruta es roja" los primeros resultados que te botará seran:
    en el arbol de manzanas "<strong>la fruta es roja</strong>"... etc y de ultimo colocara:
    <strong>la</strong> belleza de el arbol de manzana, es que su <strong>fruta</strong> es muy <strong>roja</strong>. ves? Guiño

    Aun asi, me ayudaste resto, anoche me quede hasta las 2 de la madrugada tratando de hacer esto xD

    • Responder
    • Citar
    • Comentado:
  • Pierre    

    El uso de este buscador es lo mismo que usar Google

    <strong>+</strong>palabra : busca las coincidencias con

    • Responder
    • Citar
    • Comentado:
  • Si se quieren hacer consultas de texto completo lo mejor es usar herramientas indexer/searchers externas. Ahora mismo para mysql lo mejor que hay es <a href="http://sphinxsearch.com">sphinx</a>.

    El motor fulltext de mysql tiene un rendimiento decente mientras una tabla no sea grande.

    Si os interesa el tema fulltext disponeis un manual de <a href="http://www.compuglobalhipermega.net/mysql/instalacion-configuracion-sphinx/"> instalacion y configuración de sphinx en castellano</a> y también un ejemplo completo de <a href="http://www.compuglobalhipermega.net/motores-busqueda/buscador-wikipedia/">buscador de wikipedia</a> hecho con esta herramienta.

    Un saludo

    • Responder
    • Citar
    • Comentado:
  • Soy... demasiado principiante como para guiarme de esa explicacion
    Despues de probar y probar pude hacer un "Catálogo de Productos" administrable para wohrquimica.com.ar y una seccion de Novedades también administrable. Ahora estoy queriendo hacer un buscador de productos, que sólo encuentre en NOMBRES de los productos.

    En fin..
    Fabio.. sos una masa, veo qe soy el único bruto qe no lo puedo hacer. Ya me voy a poner... y sé qe lo voy a poder hacer... (con paciencia y materia gris)


    Saludos! (Y)

    • Responder
    • Citar
    • Comentado:
  • Natalie    

    Me funciona bien el full text pero cuando desde mi formulario en php tiene dos campos de búsqueda no me resulta solo me busca por una

    • Responder
    • Citar
    • Comentado:
  • jjchmweb    

    como seria si tengo 2 tablas relacionadas x decir para una biblioteca table1= libros y table 2 capitulos?

    • Responder
    • Citar
    • Comentado:
  • un poco tarde jejeje pero no se si todavía está abierta esta discusión? estaba buscando algo sobre pasar la relevancia a porcentaje pero no en base al mas relevante, sino a los terminos de busque y cómo obtiene esa relevancia.... jjchmweb encontraste lo que buscabas?

    • Responder
    • Citar
    • Comentado:
  • Pepe    

    Una consulta con respecto al tema, tambien es un poco tarde, pero mas vale tarde que nunca..
    Como hago para buscar trozos de palabras: por ejemplo: si se me ocurre buscar carpas, como hago para que tambien encuentre carpa, o al revez, si busco carpa que tambien me encuentre carpas
    Gracias..

    • Responder
    • Citar
    • Comentado:
  • Emilio    

    Che Gracias Guiño No sabés cuanto me sirve :D

    Estoy haciendo un mini CMS con blog y eso y me faltaba la búsqueda

    Saludos!

    • Responder
    • Citar
    • Comentado:
  • Sé que debo comprarme un libro de mysql. Mientras tanto esto me sirve. Gracias

    • Responder
    • Citar
    • Comentado:
  • Zarbli    

    Encuentro esto después de haber intentado ya muchas cosas, pero alfin lo logre e incluso eh encontrado más recursos de cómo emplear MATCH AGAINST, para quién requiere más info. puede contactarme en zar.bli@gmail.com

    • Responder
    • Citar
    • Comentado:
  • Esse código funciona em tabelas innoDB?

    • Responder
    • Citar
    • Comentado:
  • Fabio    


    Cleiton Alves dijo:

    Esse código funciona em tabelas innoDB?


    no, en MyISAM, para innodb no hay Full Text Search pero se puede hacer algún intento de tener dos tablas, una la original, InnoDb, y otra la copia para búsquedas con MyISAM

    • Responder
    • Citar
    • Comentado:
  • Hola cómo están? Fabio justo estoy con un buscador y me interesó tu aporte para ver si lo aplico. Porque estoy teniendo problemas con mi código que es este:

    "NOMBRE_DE_" LIKE ´%USER_VARIABLE%´

    En realidad el problema que tengo es: en mi base de datos tengo en el campo NOMBRE_DE_ "Don Carlos S.A." por ejemplo, y si buscan "don carlos" la búsqueda no encuentra nada, supuestamente con los "%" estaría solucionado pero bueno, no funciona.

    • Responder
    • Citar
    • Comentado:
  • Hola,

    Entiendo que lo que aquí se explica es para tablas MyISAM.

    Me han dicho que lo ideal es hacer búsquedas con tablas de tipo MyISAM, y no hacer búsquedas en tablas de tipo InnoDB.

    El caso es que las tablas que utiliza el buscador son las mismas tablas que actualizan los usuarios, es decir, que los usuarios pueden insertar registros. Si los usuarios pueden insertar registros, entonces lo ideal es que las tablas sean InnoDB.

    Resumiendo: ¿cómo lo puedo hacer para que en las tablas se puedan insertar y hacer búsquedas? He pensado en hacer todas las tablas de la base de datos con InnoDB y duplicar el contenido de aquellas que utiliza el buscador, poniendo la información en otras tablas MyISAM, pero si hago esto estoy haciendo que la base de datos crezca, no sé si de forma innecesaria.

    Muchas gracias y saludos

    • Responder
    • Citar
    • Comentado:
  • Diego    

    Hola, tengo un problema al crear el indice, aparece un error diciendo que el tipo de tabla usada no soporta indices fulltext, no se si saben algo de eso.

    Saludos,

    • Responder
    • Citar
    • Comentado:
  • ms345    

    por si os vale de algo he encontrado otro tutoral con este tema:

    http://deckerix.tuxfamily.org/leerArticulo.php?post=92

    • Responder
    • Citar
    • Comentado:
  • Fernando    

    Una alternativa para indexar el contenido de campos de texto de una base de datos es Apache Lucene:
    http://lucene.apache.org/
    Básicamente es una API disponible para varios lenguajes (original para Java pero con ports para .NET, python, C y creo algunos más) que te permite indexar cualquier fuente de texto (puede ser un archivo de texto simple incluso) con un poco más de flexibilidad que el full text search directo de una BD.
    Podés definir tus propios tokenizadores (los que se encargan de cortar el texto en cachos, cada uno de los cuales se corresponde con una de las palabras a indexar) que corten el texto no simplemente por espacios en blanco e incluso realizar normalización de términos (lo que se conoce como stemming, que si buscas por "auto" y "autos" te devuelva los mismos documentos para ambas búsquedas), entre muchas otras funcionalidades.
    Recomiendo que le peguen un vistazo todos aquellos que deban incorporar full text search en algún proyecto en el que estén laburando.
    Saludos.

    • Responder
    • Citar
    • Comentado:
  • Marie    

    voy a probarlo, gracias x tu aporte, estoy iniciando en php y tengo un conocimiento medio medio de base de datos.

    Gracias x los aportes

    • Responder
    • Citar
    • Comentado:
  • Fernando    

    Dejo un artículo que aporta una crítica al tema:

    http://www.grok.in/blog/2008/11/05/full-text-search/

    Saludos y gracias.

    • Responder
    • Citar
    • Comentado:
  • nico    

    GRACIAS!!

    • Responder
    • Citar
    • Comentado:
  • --    

    Esto es asquerosamente interesante!
    te felisito

    • Responder
    • Citar
    • Comentado:
  • FLACOOOOOOOOOO me salvast la vida jajajaja

    GRACIASSSSSSSSSSS!!!!

    si qres pasate por la pagina asi vez como qdo

    www.beshop.com.ar

    MIL GRACIASSSSSSSSS

    agus

    • Responder
    • Citar
    • Comentado:
  • Mai    

    Hola! queria saber si pueden ayudarme:
    Tengo una BD de musica y queria ver como hago cuando por ejemplo tengo el mismo nombre de artista, de tema y de cd "Juan Carlos", y cuando me ingresan por teclado el dato ponen "juna Carlos" (o sea, lo ponen mal), porque quiero que muestre todas las filas donde coincida con alguno de todos aunque haya puesto mal una de las palabras, o sea que busque igual aunque una de las palabras este mal. Y aparte, que busque en todas las tablas que necesite al mismo tiempo.
    Ojala me puedan ayudar!

    • Responder
    • Citar
    • Comentado:
  • Fabio    


    Mai dijo:

    Hola! queria saber si pueden ayudarme:
    Tengo una BD de musica y queria ver como hago cuando por ejemplo tengo el mismo nombre de artista, de tema y de cd Juan Carlos, y cuando me ingresan por teclado el dato ponen juna Carlos (o sea, lo ponen mal), porque quiero que muestre todas las filas donde coincida con alguno de todos aunque haya puesto mal una de las palabras, o sea que busque igual aunque una de las palabras este mal. Y aparte, que busque en todas las tablas que necesite al mismo tiempo.
    Ojala me puedan ayudar!


    primero lo que te ingresen podés cortarlo en pedazos, es decir, cada palabra por separado

    luego hay varias formas, hay una función para las palabras que "suenan a" en MySQL: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex


    no es muy eficiente pero puede servir para casos extremos.

    así podés hacer una consulta por el match certero
    si no recibe nada una consulta por el like
    y si no llega nada una por el soundex

    o una sola consulta con UNION entre las tres querys y luego un GROUP BY para agruparlas.

    • Responder
    • Citar
    • Comentado:
  • Mai    

    Muchas gracias!! Voy a probar a ver que sale.. XD
    Besos!
    Mai

    • Responder
    • Citar
    • Comentado:
  • ISRAEL    

    Hola fabio, podrias enviar a mi correo el archivo, para hacer las modificaciones, lo que pasa es que no soy programador.

    muchas gracias

    • Responder
    • Citar
    • Comentado:
  • Efrain    

    No entendí ni pedo

    • Responder
    • Citar
    • Comentado:
  • Angel    

    ola fabio todo bien con match() y against(), trate tambien explode() pero no consigo el resultado que busco que es parecido al buscador que tiene por decirlo la pagina de la libreria el sotano, alli ingreso por ejemplo :
    cien años garcia y me da como resultado solos los titulos de "gabriel garcia marquez" garcia que contienen "cien años (de soledad)".

    en mi buscador con los parametros ya explicados en uno u otro caso me da una laaaaaaaaaaaaaaarga lista de garcias y cien y años.

    Que estoy haciendo mal ya que las busquedas por palabras y fraces no coinciden con los resultados esperados?

    gracias de antemano.

    • Responder
    • Citar
    • Comentado:
  • Marcelo    

    Consulta: nadie pudo solucionar el tema de PODER agregarle un paginador?

    • Responder
    • Citar
    • Comentado:
  • pepe    

    hola, muy chido, aunque un poco desactualizado, refresca la info, gracia loko!!

    • Responder
    • Citar
    • Comentado:
  • Luciano    

    Como puedo traer solo esos resultados que cumplen con 100% o al menos 90% de relevancia?

    • Responder
    • Citar
    • Comentado:
  • Luciano    

    Bueno ya encontre la respuesta a la pregunta que hice antes aqui va por si le sirve a alguien.
    (Long. del texto - Long. del texto sin los términos) / Long. del texto

    Me costo entender este calculo, pero cuando se entiende es increíble el resultado parece mágico.

    Es toda la cadena adonde se busca, que pueden ser la suma de varias columnas menos toda la cadena nuevamente pero sin los términos de búsqueda dividido los términos de búsqueda. Yo puse una condición en laa relavancia > 0.8 para que solo me traiga resultados con más de un 80% de las palabras que se estan buscando.

    • Responder
    • Citar
    • Comentado:
  • Luciano dijo:

    Bueno ya encontre la respuesta a la pregunta que hice antes aqui va por si le sirve a alguien.
    (Long. del texto - Long. del texto sin los términos) / Long. del texto

    Me costo entender este calculo, pero cuando se entiende es increíble el resultado parece mágico.

    Es toda la cadena adonde se busca, que pueden ser la suma de varias columnas menos toda la cadena nuevamente pero sin los términos de búsqueda dividido los términos de búsqueda. Yo puse una condición en laa relavancia &gt; 0.8 para que solo me traiga resultados con más de un 80% de las palabras que se estan buscando.


    buen tip Guiño

    • Responder
    • Citar
    • Comentado:
  • Claudio    

    como modificar el ft_min_word_len a 2 caracteres ya que lo hago desde el archivo my.ini y reinicio el servicio de mysql pero al hacer la consulta SHOW VARIABLES LIKE ´ft_min_word_len´ me sigue mostrando que el ft_min_word_len es igual a 4... espero ayuda. saludos

    • Responder
    • Citar
    • Comentado:

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https
Para evitar bots, si se tardó mucho en leer la nota seguramente no sirva y tenga que intentar dos veces

Negrita Cursiva Imagen Enlace


comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador