Ardilla Quio Ardilla Quio

08 de Febrero de 2011

MySQL: búsqueda de textos en bases de datos

Habitualmente en las páginas web necesitamos realizar búsquedas en los textos, ya sea en artículos, noticias o cualquier sección de nuestra web. Cuando esta búsqueda es sobre una base de datos, la primera idea que nos surge es la del operador LIKE de SQL. Pero esta búsqueda tiene un rendimiento bastante malo, puesto que necesita realizar la búsqueda en todas las filas de la tabla encontrando coincidencias en todas las subcadenas de los campos seleccionados.

También tiene otros inconvenientes como que no podemos ordenar los resultados por número de apariciones o lo engorroso que resultan las búsquedas cuando son de varios términos sobre múltiples columnas.

SELECT name FROM table_example WHERE name LIKE "%search%" OR description LIKE "%search%";

Índices FULLTEXT

Para realizar búsquedas de texto sobre tablas MySQL existe un tipo de índice especial llamado FULLTEXT. Sobre éste indicaremos las columnas de búsqueda y él irá indexando todas las palabras incluidas pudiendo realizar así búsquedas de forma rápida. El índice sólo es válido para tablas MyISAM y los campos deben ser de tipo CHAR, VARCHAR o TEXT.

La forma de crear y usar el índice es:

ALTER TABLE table_example ADD FULLTEXT(name, description);
SELECT name, description FROM table_example WHERE MATCH(name, description) AGAINST ("search")

Los resultados, por defecto, están ordenados por relevancia, las palabras de menos de 4 letras quedan excluidas de la búsqueda y si los términos de búsqueda están presentes en más del 50% de los resultados éstos no se mostrarán.

Búsquedas IN BOOLEAN MODE

El ejemplo anterior hace referencia a las búsquedas naturales, pero existe además un modificador que nos permite utilizar operadores en las mismas, al estilo "Google": IN BOOLEAN MODE.

Algunas de las características de las búsquedas FULLTEXT no se aplican en este tipo de consultas, como son la ordenación por relevancia o el límite del 50%.

SELECT name, description FROM table_example WHERE MATCH(name, description) AGAINST ("+search -banned" IN BOOLEAN MODE)

Algunos de los operadores que podemos aplicar en las búsquedas booleanas son:

  • El signo + indica que la palabra debe estar presente en cada resultado.
  • El signo - indica que la palabra no debe estar presente en ningún resultado.
  • El signo ~ indica que la palabra perderá peso en la relevancia de los resultados.
  • El asterisco * sirve para buscar las palabras que comiencen por el término de búsqueda.
  • Las comillas "" devolverán las coincidencias exactas con el texto que contienen.

Aunque estos índices resulten más eficientes para grandes volúmenes de datos, siempre deberemos analizar los requerimientos de nuestras búsquedas para determinar que es lo que más se ajuste a nuestras necesidades.

Más información

Manual de MySQL: Funciones de búsqueda de texto completo

16 comentarios

Hector Caballero

18/12/2020 19:41:25

Se puede reemplazar por ejemplo (?) por la (Ñ)

PemoWeb

07/01/2020 19:41:33

Muy buen en verdad... pero se podra realizar con más campos

ang

14/12/2019 03:16:31

Buen post. Gracias.

Marcos

02/10/2017 09:18:08

Esto es excelente

QuePasaLongiqloijoelatragasable

11/04/2017 16:33:45

Nice

hackmon

02/12/2016 17:07:46

Simplemente wow, mis LIKE hacían 40 segundo, ahora mi búsqueda hace 0.04 segundos

nan_do9@yahoo.com

15/11/2016 21:48:02

tengo la versión de mysql 5.5.52 pero no me funciona

yolo

11/03/2016 21:00:06

Bueno

anonimo

07/09/2015 18:17:37

facil de entender gracias

Anónimo

10/07/2015 12:08:26

no te comprendo

Sergio_Between

07/05/2015 18:36:37

REALMENTE ES UN GRAN AVANCE PARA HACER FUNCIONES DE BUSQUEDAS EN BASE DE DATOS. O SEA, QUE LIKE %TAL% AND LIKE %TAL% AND ... ES ALGO COMPLEJO, POR SU PUESTO, PROBRE LIKE, LO LLENÁBAMOS DE TRABAJO Y EL POBRECILLO NI CULPA TIENE DE QUE NOSOTROS NO SEPAMOS.

Daniel

16/01/2015 18:27:55

Excelente !. gracias.

Javier

22/03/2014 02:05:32

Muchas gracias por tu aporte...

A mi me apoyo porque en donde trabajo hay bases de datos que los nombres inician con apellidos y en otras viceversa.

Juan

28/07/2013 10:26:57

despues de muchos tiempo haciendo buscadores con LIKE desgolsando frases me encuentro que existe esto. O.o jajjaja Muuuuchas gracias compi!

Anónimo

06/02/2013 19:33:32

Gracias por la información...estaba buscando lo de los operadores...

Arapo

10/01/2012 04:08:42

Me gusta vuestro estilo... Buen post. Gracias.

Comentario anónimo
Comentar como usuario