lunes, 15 de febrero de 2010

Full-Text Search I: Que es y para que se usa FTS

Introducción:

FTS es una funcionalidad de búsqueda que habilita la manera más rápida y sencilla para la búsqueda de texto dentro de SQL server (Crea un diccionario de palabras). Aunque el concepto de full text search no es nuevo en SQL Server 2008, hay mejoras considerables de gestión y rendimiento en SQL Server 2008.


Full Text Search en SQL Server 2005

SQL Server a través de Transact SQL puede buscar las coincidencias de un valor en los datos aportados. Por ejemplo, en una tabla de la BDD hay una columna llamada Notes, podemos buscar registros que contengan la expresión "Full-Text Search" o los campos que sean iguales a "SQL Server 2008" lo cual sería algo como esto:

SELECT * FROM NotesTable WHERE Notes Like = ‘%Full-Text Search%'

SELECT * FROM NotesTable WHERE Notes = ‘SQL Server 2008'



Las consultas en T-SQL dan un rendimiento óptimo cuando sabemos exactamente lo que estamos buscando. Por Ejemplo, si buscamos un producto en la tabla "products", podríamos usar el campo "ProductCode" en la sentencia SQL:

SELECT * FROM Products WHERE ProductCode = ‘SQL2005EE'



Pero T-SQL no siempre no da los resultados deseados, por ejemplo en la siguiente sentencia:

SELECT * FROM Notes Table WHERE Notes Like ‘%Full-Text Search%'



Esta consulta no listaría por ejemplo los campos que contuvieran la frase de esta manera "Full-Text Index Search". O tampoco si hubiera un doble espacio en la frase.

Podría ser útil haciendo menos exacta la sentencia, por ejemplo:

SELECT * FROM NotesTable WHERE Notes Like ‘%Full%Text%Search%'



Pero una de las cosas más críticas de T-SQL es que tenemos que poner el orden exacto de la consulta. Por ejemplo si tu tabla tuviera un registro que fuera "Searches using Full-Text Indexing", para encontrar el resultado nuestra query debería de ser algo como esto, algo que en la realidad no debería de ser implementado ya que el tiempo de respuesta seria ineficiente:

SELECT * FROM NotesTable WHERE Notes Like ‘%Full%Text%Search%' OR Notes Like ‘%Search%Full%Text%' OR... (Y así sucesivamente hasta tener todas las posibilidades de respuesta cubiertas en la consulta)



Esta consulta seria el camino para encontrar lo que necesitamos pero los usuarios se quejarían de lentitud en este tipo de consultas, ¿cómo lo solucionamos? Bien esto es un problema de indexado.

Los métodos clásicos de indexado usado en las BDD de SQL usarían los índices en una búsqueda usando el Like:

SELECT * FROM NotesTable WHERE Notes Like ‘Full Text Search%'



En esta consulta el índice seria de mucha ayuda pero solo nos serviría para los registros que empiecen por ‘Full Text Search' pero los índices en el campo Notes no serian de utilidad si los registros buscados tuvieran ‘Full Text Search' en medio del texto o al final.

SELECT * FROM NotesTable WHERE Notes Like ‘%Full Text Search%'



Como resultado de la consulta anterior se realizaría un escaneado completo de la tabla lo cual no será lo que queremos si ésta es un una tabla que tenga algunos GB de tamaño.

En las aplicaciones de hoy en día las cosas no son tan claras. Por cada búsqueda en el campo dedicado a ello en la aplicación tendríamos que tener una consulta diferente en función del campo lo cual no es posible. Por lo tanto Transact SQL no nos da la solución a nuestros problemas.

En Microsoft SQL Server tenemos una característica llamada Full-Text Search. Esta característica se habilita a nivel de instancia, de tal manera que una instancia de motor de base de datos SQL Server, tendremos una instancia de motor Full-Text Search.

En el siguiente artículo veremos como implementar FTS.

Un Saludo.

1 comentario:

Te resulta interesante esta informacion? Tienes alguna duda? Adelante hazmelo saber