You are on page 1of 5

FULLTEXT SEARCH EN SQL SERVER

Enviado por Admin el Domingo, 01 de Febrero de 2004 (Her) FULL-TEXT Search es una herramienta muy poderosa del SQL Server, y adems es relativamente sencilla como comprobamos en este artculo.

FULL-TEXT Search en SQL Server


Introduccin
En SQL Server como en cualquier otro sistema gestor de bases de datos podemos realizar bsquedas en nuestras tablas a travs del lenguaje SQL. Cuando queremos encontrar una palabra en un campo char o varchar basta con realizar una consulta en la que pongamos nuestra condicin en la clusula WHERE para cualificar las filas deseadas. Esto casi siempre es suficiente, pero hay casos en los que es necesario realizar bsquedas ms complicadas. Por ejemplo bsquedas que incluyan dos o ms palabras, o que proporcionen resultados ordenados segn el peso que le damos a las palabras buscadas, o que busquen en catlogos enormes con cientos de miles de filas En estos casos el motor de la base de datos que realiza estas bsquedas no es el ms adecuado por varias razones: el cdigo SQL para obtener los resultados deseados puede llegar a complicarse mucho, las bsquedas se pueden eternizar porque obligamos al motor de la base de datos a analizar cada fila y todas las palabras que hay en cada fila, hacer bsquelas de grupos de palabras es muy costoso Es aqu donde el servicio Microsoft Search viene en nuestra ayuda.

El Servicio Microsoft Search

El Servicio Microsoft Search es un motor de indexacin y de bsqueda de texto que permite al SQL Server realizar consultas de texto eficaces y sofisticadas sobre columnas que almacenan datos basados en caracteres. Entre las diferencias existentes entre este servicio y las bsquedas que utilizan el operador LIKE podemos citar las siguientes: Se almacenan en el sistema de archivos y no en la base de datos, aunque es la base de datos quien los administra. Slo se permite un ndice de texto por cada tabla. Si se desea agregar datos a los ndices de texto hay que realizar un llenado manual o programado (Tambin se pueden llenar automticamente en la insercin de datos). Son ms rpidos y flexibles. La utilizacin del servicio Microsoft Search tendr dos vertientes. En primer lugar tenemos que crear los ndices de texto en las tablas deseadas y llenarlos, y en segundo lugar el servicio realizar las bsquedas y devolver conjuntos de resultados adecuados al criterio de bsqueda. Pero antes de utilizar este servicio tenemos que instalarlo. El motor de texto se ejecuta como un servicio denominado Microsoft Search en Windows NT Server, Windows 2000 y Windows 2003 Server y tambin se puede instalar durante la instalacin del SQL Server (No est disponible para la versin SQL Server Personal). Para saber si este servicio est instalado en nuestro equipo la manera ms sencilla es recurrir al

Administrador de Servicios del SQL Server

Donde podemos ver si el servicio est instalado y adems podemos iniciar o detenerlo a voluntad.

Catlogos de texto

Se llama catlogo de texto al lugar fsico donde se almacenan los ndices de texto de una base de datos. Cada catlogo puede satisfacer las necesidades de indexacin de varias tablas de una base de datos. Estos catlogos de texto se deben ubicar en una unidad de disco local asociada a la instancia de SQL Server (Las unidades extrables, los disquetes y las unidades de red no sirven). En cada servidor pueden crearse hasta 256 catlogos de texto

ndices de texto

Los ndices de texto se vinculan a una columna de una tabla. Un primer requisito es que la tabla en cuestin tiene que tener un ndice exclusivo, que debe ser lo ms pequeo posible para reducir los recursos utilizados por el servicio Microsoft Search. Este ndice que creamos sobre una columna de texto almacenar informacin sobre cada palabra que contiene la columna y su ubicacin dentro de la tabla. Los ndices se pueden actualizar (como los ndices normales del SQL Server) al modificar los datos de la tabla, o se pueden llenar a intervalos regulares. Estos procesos de llenado se suelen realizar de forma asncrona y en segundo plano porque consumen tiempo y recursos.

Creacin de un catlogo y un ndice en 10 sencillos pasos

Para crear un catlogo de texto podemos utilizar el Administrador Corporativo con los asistentes y el interfaz grfico proporcionado, o podemos hacerlo mediante sentencias TSQL. En este caso vamos a utilizar la segunda opcin porque es un mtodo ms ilustrativo y porque si conocemos este camino usar los asistentes es muy sencillo. Vamos pues a ver paso a paso que sentencias y procedimientos almacenados intervienen en la creacin de nuestro catlogo de texto. 1-Comprobar que el servicio Microsoft Search esta funcionando Ya hemos visto un modo sencillo de comprobar esto con el Administrador de Servicios del SQL

Server. Si no est instalado hay que hacerlo y ponerlo en funcionamiento. 2-Crear una base de datos y habilitarla para utilizar catlogos de texto En vez de crear una base de datos por sencillez vamos a utilizar la base de datos Northwind que viene instalada con el SQL Server. Habilitarla para usar catlogos de texto se traduce en ejecutar la sentencia sp_fulltext_Database en el Analizador de Consultas:
use Northwind go sp_fulltext_Database 'enable'

3-Crear un catlogo vinculado con esta base de datos Utilizamos el procedimiento almacenado sp_fulltext_catalog que crea o quita un catlogo de texto, e inicia o detiene la accin de indizacin de un catlogo (luego lo veremos). Este procedimiento recibe un par de parmetros. El primero es el nombre del catlogo y el segundo indica la accin a realizar. Vamos a crear un catlogo que se llame Ingredientes.
sp_fulltext_catalog 'Ingredientes','create'

4-Habilitamos la tabla para usar ndices de texto Ahora escogemos la tabla que queremos indizar y habilitamos y aadimos esa tabla a nuestro catlogo. Para hacerlo usamos el procedimiento almacenado sp_fulltext_table. Este procedimiento funciona de la siguiente manera:
sp_fulltext_table nombre de la tabla, accin, catalogo, ndice nico de la tabla

donde PK_Products es una clave nica definida en nuestra tabla. 5-Habilitar la columna que contendr las palabras a buscar El procedimiento almacenado sp_fulltext_column especifica si una columna particular de una tabla participa en la indizacin de texto. Habilitemos la columna ProductName
sp_fulltext_column 'Products', 'ProductName', 'add'

6-Activar la tabla Con el procedimiento almacenado visto anteriormente sp_fulltext_Table activamos la tabla con la que estamos trabajando para poder llenarla.
sp_fulltext_Table 'Products', 'Activate'

7-Llenar el catlogo Y un ltimo paso es rellenar el catlogo que tenemos con los datos de la tabla que participa de la indizacin. El procedimiento almacenado que lo hace por nosotros es sp_fulltext_catalog que ya comentamos anteriormente. Se puede utilizar para rellenar un catlogo completamente o para iniciar un rellenado incremental.

En este ejemplo queremos realizar un llenado completo porque por ahora esta vaco.
sp_fulltext_catalog 'Ingredientes','start_full'

y por fin hemos acabado de crear el catlogo de texto y lo tenemos operativo. Ahora slo falta utilizarlo. 8-Comprobar que funciona Un ltimo paso es ejecutar una sentencia sencilla que utilice el catlogo recin creado para comprobar que funciona.
SELECT * FROM products WHERE CONTAINS(ProductName,'queso')

y esta sentencia nos devuelve todas las filas que contienen la palabra queso. 9-Modificar las tablas Insertemos un par de filas nuevas en la tabla productos.
INSERT INTO Products VALUES('Queso fresco de Burgos', 5, 4, '1 kg pkg', 12, 30, 0, 0, 0) INSERT INTO Products VALUES('Quesitos de la abuela', 5, 4, '8 porciones', 41, 10, 0, 0, 0)

Si ahora repetimos la bsqueda de antes veremos que este nuevo queso no aparece en los resultados. Hace falta reconstruir el catalogo de texto 10-Rellenar el catalogo de manera incremental Ejecutamos el mismo procedimiento almacenado que en el paso 7 pero ahora para rellenar el catlogo slo con las filas que han sido creadas desde entonces.
sp_fulltext_catalog 'Ingredientes', 'start_incremental'

y ahora con el catlogo actualizado podemos ejecutar otra vez el


SELECT * FROM products WHERE CONTAINS(ProductName,'queso')

para ver que ahora s obtenemos la fila insertada en el paso 9 Nuestro catlogo est creado y funcionando. Ahora hay que averiguar como le sacamos partido a estos catlogos de texto.

Consultas a los catlogos de texto


Tenemos ahora que ejecutar consultas que utilicen este catlogo, y distinguiremos dos tipos de consultas: las que utilizan un predicado sencillo como CONTAINS o FREETEXT, y las que utilizan funciones como CONTAINSTABLE y FREETEXTTABLE. En este artculo nos quedaremos slo con las primeras por ser las ms sencillas. Predicado CONTAINS Es un predicado que se utiliza para buscar en columnas que contengan tipos de datos de tipo

carcter coincidencias exactas o aproximadas con palabras o frases. CONTAINS puede buscar una palabra o una frase, el prefijo de una palabra, una palabra cerca de otra palabra, una palabra que sea una inflexin de otra, una palabra que tenga un peso especificado mayor que el de otra Como vemos es muy flexible. Vamos a ver su uso con un par de ejemplos que como siempre es la mejor manera. 1-Buscar todas las filas que contengan la palabra queso
SELECT * FROM products WHERE CONTAINS(ProductName,'queso')

2-Buscar todas las filas que contengan queso y burgos


SELECT * FROM products WHERE CONTAINS(ProductName,'queso AND burgos)

3-Buscar todas las filas que tienen queso, quesitos, quesada


SELECT * FROM products WHERE CONTAINS(ProductName, '"ques*"')

Adems de estas hay otras formas un poco ms elaboradas de utilizar CONTAINS. Como siempre todo lo tenis en los BOL. Predicado FREETEXT Se utiliza para buscar en columnas de tipo carcter valores que coincidan con el significado de la condicin de bsqueda. Cuando se utiliza FREETEXT se separa la cadena buscada internamente en palabras que son trminos de bsqueda y se asigna a cada uno de los trminos un peso y se buscan las coincidencias. Supongamos que queremos comer chocolate y queso. Pues al argumento de FREETEXT puede ser algo como quiero comer chocolade con queso y nos dar las filas que contienen palabras de nuestra frase (usamos chocolade porque es as como est escrito en Northwind)
SELECT * FROM Products WHERE FREETEXT(ProductName, 'quiero comer chocolade con queso')

Y para terminar decir que todo esto lo podemos comprobar de manera grfica como decamos al principio en el Administrador Corporativo. Dentro de la base de datos Northwind hay una categora que es Catlogos de Texto y en ella est el catlogo Ingredientes que tiene indexada la tabla Productos. Como podis ver la utilizacin de catlogos de texto es una herramienta muy potente del SQL Server y puede ser de gran ayuda a la hora de realizar bsquedas. Una aplicacin directa podra ser un buscador en una Web http://sql.manivesa.com/Tutoriales+SQL/SQL+Server/207.aspx

You might also like