{"id":139,"date":"2014-02-17T22:58:25","date_gmt":"2014-02-17T23:01:45","guid":{"rendered":"https:\/\/b1907people-search-pic.jpg"},"modified":"2015-07-16T20:35:08","modified_gmt":"2015-07-17T02:35:08","slug":"como-usar-fulltext-en-mysql","status":"publish","type":"post","link":"https:\/\/emanuelpaxtian.com\/blog\/como-usar-fulltext-en-mysql\/","title":{"rendered":"Como usar FullText en Mysql"},"content":{"rendered":"<p>Cuando debemos buscar entre una gran cantidad de datos, la b\u00fasqueda con el comando Like se hace tediosa y bastante imprecisa, debemos comenzar a utilizar las b\u00fasquedas FullText.<\/p>\n<p>El problema se presenta cuando nuestra aplicaci\u00f3n ya dispone de un n\u00famero elevado de registros, digamos m\u00e1s de 500, entonces los resultados devueltos por el buscador pueden ser muy elevados y totalmente irrelevantes.<\/p>\n<p>Para combatir este problema en MySQL se crearon un tipo de \u00edndices llamados<strong> FullText,<\/strong> estos \u00edndices nos permiten hacer b\u00fasquedas mucho m\u00e1s afinadas que las prestadas por Like, ya que ellos mismos <strong>devuelven un valor en forma de porcentaje<\/strong> indic\u00e1ndonos el grado de semejanza que tiene el t\u00e9rmino buscado con los registros encontrados en la base de datos.<\/p>\n<p>Un ejemplo pr\u00e1ctico:<\/p>\n<p>Imaginemos que tenemos la siguiente estructura:<\/p>\n<pre class=\"brush:sql\">CREATE TABLE `autos` (\r\nidprod INT(11) NOT NULL AUTO_INCREMENT,\r\nnombre VARCHAR(120),\r\ndescripcion VARCHAR(255),\r\nPRIMARY KEY (idprod),\r\nUNIQUE KEY idprod (idprod),\r\n);<\/pre>\n<p>Si un usuario hace una b\u00fasqueda en nuestra base de datos por ejemplo con la palabra &#8220;Audi&#8221;, la funci\u00f3n le devolver\u00eda los siguientes resultados:<\/p>\n<pre class=\"brush:sql\">SQL=\"Select idprod, nombre From coches Where nombre Like '%Audi%';\"\r\n<\/pre>\n<pre>idprod | nombre \r\n\r\n**********************************************\r\n\r\n1 | Audi A3 TDI\r\n\r\n2 | Audi A3 TDI\r\n\r\n3 | Audi 100 CV\r\n\r\n4 | Equipo de Audio 100Wats\r\n\r\n5 | Los coches cada vez tienen m\u00e1s audiencia\r\n<\/pre>\n<p>Como se puede observar, la consulta no es todo lo exacta que deseamos ya que est\u00e1 devolviendo registros que no tienen nada que ver con la consulta original del usuario. Y no nos paremos a pensar si el usuario pone en su b\u00fasqueda &#8220;Audi barato&#8221;, nos llegar\u00eda a mostrar coches con la palabra &#8220;barato&#8221; en su nombre aunque no fuesen de la casa Audi. FullText es la soluci\u00f3n Desde la versi\u00f3n 3.23.23 de MySQL existe un tipo de \u00edndice llamado FullText, para poder implementarlo primero deberemos de a\u00f1adirlo a nuestra tabla, hay que tener en cuenta que este tipo de \u00edndices tan solo se pueden utilizar en tablas MyIsam, crearemos el \u00edndice de la siguiente manera:<\/p>\n<pre>ALTER TABLE autos ADD FULLTEXT (nombre, descripcion);\r\n<\/pre>\n<p>Ahora llega el momento de realizar la consulta que extraer\u00e1 los registros de la tabla:<\/p>\n<pre class=\"brush:sql\">SQL=\"Select nombre, descripcion From autos Where Match(nombre, descripcion) AGAINST ('busqueda');\"\r\n<\/pre>\n<p>Esta consulta nos devolver\u00e1 exactamente lo que queremos ver, realmente no s\u00e9 que criterios obedece este tipo de \u00edndice para extraer los coincidencias m\u00e1s exactas, pero el caso es que funciona y muy bien. De igual manera, este tipo de b\u00fasqueda tiene unas caracter\u00edsticas peculiares:<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando debemos buscar entre una gran cantidad de datos, la b\u00fasqueda con el comando Like se hace tediosa y bastante imprecisa, debemos comenzar a utilizar las b\u00fasquedas FullText. El problema&hellip;<\/p>\n","protected":false},"author":1,"featured_media":601,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mysql"],"_links":{"self":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/comments?post=139"}],"version-history":[{"count":0,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/139\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media\/601"}],"wp:attachment":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media?parent=139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/categories?post=139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/tags?post=139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}