Blog de Gonzalo

BÚSQUEDA POR TEXTO

Cuando en una base de datos se tiene que hacer una búsqueda por texto se usa el operador LIKE y si se quieren mostrar varios resultados que concuerden con esa búsqueda se usa LIKE '%%'. Pero cuando se quiere hacer una búsqueda por texto y solo se quiere obtener un resultado lo más óptimo es crear un índice FULLTEXT y luego aprovechar ese índice en la query.
Para crear el índice hay que ejecutar la siguiente query en la base de datos: ALTER TABLE TABLA ADD FULLTEXT(CAMPO1, CAMPO2, etc...);. No es conveniente abusar de los índices así que lo mejor será diseñar bien la base de datos y ver los posibles campos que pueden ser índices FULLTEXT.
El siguiente paso es usar dichos índices en las queries que se van a usar para buscar texto: SELECT * FROM TABLA WHERE MATCH(CAMPO_INDICE) AGAINST ('$busqueda $busqueda2').
Como se puede ver es bastante sencillo y no tiene ninguna complicación.
También se pueden usar la opción de IN BOOLEAN MODE en el que se especifica que la búsqueda se hará de forma booleana, el texto puede contener operadores que indiquen que una palabra no este presente o por el contrario que si deba estar una palabra en todos los resultados que se obtengan. Además se puede indicar una ponderación especial para una palabra, al igual que en Google.
Ejemplo:
+hola: indica que la palabra hola debe estar en los resultados siempre.
-por: indica que la palabra "por" es una palabra sin importancia, no revelante (stopword).
~noquiero: indica que la palabra "noquiero" no debe estar en los resultados obtenidos.
Las búsquedas se pueden ordenar por relevancia (lo que se denomina WITH QUERY EXPANSION) donde se realizan dos búsquedas, en la primera búsqueda se determinan las palabras más relevantes de la información encontrada, y en la segunda búsqueda se agregan dichas palabras a la cadena a buscar y se retorna el resultado de la segunda búsqueda.
Ejemplo:
SELECT MATCH(‘Content’) AGAINST (‘keyword1keyword2’) as Relevance FROM table WHERE MATCH
(‘Content’) AGAINST(‘+keyword1 +keyword2’ IN
BOOLEAN MODE) HAVING Relevance > 0.2 ORDER BY Relevance DESC
Las búsquedas FullText tienen las siguientes características:

  • Límite del 50%: Cuando una consulta se encuentra en mas del 50% de los registros de la tabla esto hace que la consulta sea invalida. Porque al estar en mas de la mitad de los registros los resultados ya dejan de ser información relevante.
  • Las palabras de menos de 3 caracteres no se buscan ya que estas palabras son muy comunes, por ejemplo que pasaría si buscamos "a" devolvería prácticamente todos los registros de la tabla con lo cual deja de ser información útil.
  • La búsqueda es Case-Insensitive: Porque si se busca “Cable” buscara cable, cAble, cABle, etc...

Compartir en twitter