Fulltext de varias columnas (rarezas MySQL II)

marzo 28, 2010

Si el anterior post comentábamos algunas rarezas de mysql con los campos timestamp, los índices FULLTEXT, tampoco se quedan cortos. Este tipo de índices indexan cada palabra del campo, normalmente un texto, con el objeto de facilitar las búsquedas por palabras.  Luego se utiliza el operando SQL: MATCH (columnas) AGAINST (expresion).

Hasta allí todo normal. Imaginaos que tengo indexados dos campos, titulo y texto, cada con su FULLTEXT. ¿como tengo que realizar la búsqueda sobre los dos campos?
Lo lógico es pensar que MATCH(titulo,texto) AGAINST('lorem') bastaría, pero no es así. Lo que hay que hacer es:

  1. Definir un solo índice fulltext con las dos columnas, mediante SQL ya que phpmyadmin no lo permite: ALTER TABLE tbl ADD FULLTEXT combinado(titulo,texto).
  2. Debes repetir en “MATCH” todos los campos indexados. Es decir: MATCH(titulo,texto) AGAINST ("LOREM")

Evidentemente la consulta SQL final será tan largo como:
SELECT *, MATCH(titulo,texto) AGAINST("LOREM") as ratio FROM bs WHERE MATCH(titulo,texto) AGAINST("LOREM") ORDER by ratio DESC

Para terminar, apunto algunas cosillas mas sobre fulltext:
– con pocos registros en la tabla, MATCH, siempre devuelve cero.
– hemos llamado al índice “combinado” (1º paso), pero ese nombre no se utiliza para nada.
– con muchos resultados positivos (una palabras que aparezca en todos los registros) MATCH también devuelve cero.

A pesar de sus peculiaridades los campos FULLTEXT son muy útiles…pero raritos…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: