¿Cómo habilitar el servicio Full-text Indexing en MSSQL 2008?

MSSQL No Comments »

La búsqueda de texto completo (full text search) es una técnica para buscar texto en un documento o en una base de datos. El motor de la búsqueda se encarga de examinar todas las palabras de un documento y las compara con las palabras proporcionadas por un usuario. La búsqueda es completa porque todas las palabras de los documentos o de la base de datos se ocupan. No todas las búsquedas son completas. En el caso de los sitios web, existe por ejemplo la búsqueda por tags que examina solamente el catálogo de tags y no el contenido tageado. Es una táctica menos costosa y que puede ser bastante potente si el contenido está correctamente tageado. Tambien vale la pena mencionar que el mismo sistema gestor de base de datos dispone de varios técnicas para consultar una tabla: Table Scan, Index Seek, etc.

¿Cuando se requiere ocupar la búsqueda de texto completo? Como todos lo saben, en SQL Server igual que en cualquier otro sistema gestor de base de datos ya existen comandos que permiten realizar búsquedas en tablas. Por ejemplo, si queremos buscar el país ‘México’ en un catálogo de paises, basta con ejecutar el siguiente comando SQL:

SELECT * FROM Pais WHERE nombre = 'México'

Esto es más que suficiente para ese tipo de búsquedas. Sin embargo, existen casos dónde se requiere recurrir a consultas más complejas donde por ejemplo:

- se ocupan documentos o tablas con un volumen importante.
- se realiza una búsqueda con más de una palabra o una frase.
- la cercanía de las palabras es relevante: se busca la palabra ‘México’ y ‘playa’ con 5 palabras o menos entre cada uno.
- se asignan pesos/importancias diferentes en cada palabra de una frase.
- se necesita considerar las derivaciones de una palabra o de un verbo (ejemplo: correr, corrimos, corre).
- se necesita realizar un búsqueda en campo binario (varbinary o image).
- se toman en cuenta sinonimos (tesaurus)

El Full-Text Engine que dispone SQL Server 2008 permite contestar de forma eficaz a estas consultas, sus táreas más importantes son la indexación y la consulta. La indexación consiste en la creación de una tabla donde se almacenan todas las palabras encontradas en los textos analizados. Por cada palabra se conservan datos como su posición en los documentos, su frecuencia,… No todas las palabras se indexan. El motor de indexación utiliza stoplists (compuestas de stop words) para ignorar palabras como “de”, “la” o “en” con poca relevancia.

Antes, con SQL Server 2000, la indexación se realizaba mediante el servicio MSSEARCH Service (Microsoft Search). Este servicio presente en cada sistema operativo tenía la desventaja de ser compartido con otros procesos como SharePoint o Exchange. Se mejoró esa situación con SQL Server 2005 ya que se agregó funcionalidad para poder crear instancias exclusivas del servicio de búsqueda (Microsoft Full-Text Engine for SQL Server). Sin embargo, una de las consecuencias negativas de esta arquitectura divida entre varios procesos es que los datos indexados no se están respaldando en la base de datos si no en el servicio de búsqueda (externo a la base de datos), lo cual podía complicar la tarea del DBA a la hora de realizar réplicas de una máquina a otra. Al contrario de la versión 2000 & 2005, el Full-Text Engine de SQL Server 2008 está ahora totalmente integrado al mismo proceso de SQL Server como cualquier otro tipo de servicio de la base de datos. Este cambio estructural es muy importante y trae consigo beneficios tanto de rendimiento como de seguridad (leer más en MSDN).

En el siguiente ejemplo, vamos a crear un catálogo de indexación para una tabla de comentarios de un blog ficticio. El Full-Text Engine no está incluido en todas las versiones de SQL Server 2008. Si igual que yo trabajan con la versión Express, deben descargar la versión Express with Advanced Services. Pueden verificar que tengan el servicio instalado mediante la siguiente instrucción:

SELECT fulltextserviceproperty('isfulltextinstalled')

Luego, vamos a crear una base de datos para hacer nuestras pruebas:

USE master
IF DB_ID('full_text_db') IS NOT NULL
DROP DATABASE full_text_db
CREATE DATABASE full_text_db
GO

Se tiene que verificar que nuestra base de datos tenga la búsqueda de texto completo activado:

SELECT DATABASEPROPERTY('full_text_db', 'IsFullTextEnabled');

Si el servicio no está habilitado sobre la base de datos que creamos, lo pueden activar de la siguiente manera:

USE full_text_db
GO
EXEC sp_fulltext_database 'enable'

Ya con nuestra base de datos lista, podemos crear nuestro catálogo de indexación:

CREATE FULLTEXT CATALOG comentariosFullTextSearch

Creamos la tabla de comentarios cuyo contenido vamos a indexar. Es obligatorio crear un índice sobre esa tabla ya que el servicio de indexación lo requiere:

CREATE TABLE Comentarios (
ID [int] IDENTITY(1,1) NOT NULL,
contenido VARCHAR(8000) NOT NULL,
CONSTRAINT [PK_Comentarios] PRIMARY KEY CLUSTERED
(
ID ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Nada más se tienen que indexar la columnas que se requieren. En nuestro caso vamos a avisar al Full-Text Engine que queremos indexar a la columna ‘contenido’. Mediante la instrucción ‘Language’ indicamos en que idioma está el texto que contiene la tabla:

CREATE FULLTEXT INDEX ON Articulo
(
contenido
Language 0XC0A -- Local ID para español - 3082/0XC0A
)
KEY INDEX PK_Articulo ON articulosFullTextSearch
WITH CHANGE_TRACKING AUTO

Nada más nos queda llenar nuestra tabla con datos de prueba y lanzar la indexación. Por lo general, la indexación se dispara de forma automática y se actualiza regularmente cada vez que se cambian datos en una columna indexada por ejemplo:

INSERT INTO Comentarios VALUES ('México es muy lindo.')
INSERT INTO Comentarios VALUES ('Me gusta Méchico.')
INSERT INTO Comentarios VALUES ('¡Viva Méjico!')
GO
ALTER FULLTEXT INDEX ON Comentarios
START FULL POPULATION

Si todo salió correctamente, ya deben de poder ejecutar la siguientes consultas y empezar a hacer uso del catálogo de indexación que creó el Full-Text Engine para nosotros:

SELECT * FROM Comentarios WHERE CONTAINS(contenido, '"*México*"')
SELECT * FROM Comentarios WHERE CONTAINS(contenido, '"México*" OR "Méjico"')

En mi siguiente post, les daré más explicación sobre los predicados CONTAINS y FREETEXT y sobre cómo armar consultas con sinónimos usando un archivo XML (tesaurus).

FUENTES:
http://en.wikipedia.org/wiki/Full_text_search
http://msdn.microsoft.com/es-es/library/ms142571.aspx

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in