Introducción a la búsqueda de texto completo
Las bases de datos de SQL Server están habilitadas de forma predeterminada en texto completo. Sin embargo, para usar un índice de texto completo en una tabla, debe configurar la capacidad de indización de texto completo en las columnas de las tablas a las que desea obtener acceso mediante el motor de búsqueda de texto completo.
Configurar una base de datos para la búsqueda de texto completo
En cualquier escenario, un administrador de bases de datos realiza los siguientes pasos básicos para configurar columnas de tabla en una base de datos para la búsqueda de texto completo:
Crear un catálogo de texto completo
En cada tabla en la que se desea buscar, crear un índice de texto completo por:
Identificar cada columna de texto que se desea incluir en el índice de texto completo.
Si una columna determinada contiene documentos almacenados como datos binarios (
varbinary(max)
oimage
datos), debe especificar una columna de tabla (la columna de tipo) que identifique el tipo de cada documento de la columna que se está indizando.Especificar el idioma que se desea que utilice la búsqueda de texto completo en los documentos de la columna.
Elegir el mecanismo del seguimiento de cambios que se desea utilizar en el índice de texto completo para el seguimiento de cambios en la tabla base y sus columnas.
La búsqueda de texto completo admite varios idiomas a través del uso de los componentes lingüísticos siguientes: separadores de palabras y lematizadores, listas de palabras irrelevantes y archivos de diccionarios de sinónimos. Los archivos de diccionario de sinónimos y, en algunos casos, las listas de palabras irrelevantes requieren su configuración por un administrador de la base de datos. Un archivo de diccionario de sinónimos determinado admite todos los índices de texto completo que usen el idioma correspondiente, y una lista de palabras irrelevantes determinada puede estar asociada a tantos índices de texto completo como se desee.
Configurar un catálogo y un índice de texto completo
Esto implica la realización de los siguientes pasos básicos:
Crear un catálogo de texto completo para almacenar índices de texto completo.
Cada índice de texto completo debe pertenecer a un catálogo de texto completo. Puede crear un catálogo de texto independiente para cada índice de texto completo o puede asociar varios índices de texto completo a un catálogo determinado. Un catálogo de texto completo es un objeto virtual y no pertenece a ningún grupo de archivos. El catálogo completo es un concepto lógico que hace referencia a un grupo de índices de texto completo.
Crear un índice de texto completo en la tabla o en la vista indizada.
Un índice de texto completo es un tipo especial de índice funcional basado en token que crea y mantiene el motor de texto completo. Para crear una búsqueda de texto completo en una tabla o vista, debe haber un índice único de una sola columna que no acepte valores NULL. El motor de búsqueda de texto completo requiere este índice único para asignar cada fila de la tabla a una clave única que se pueda comprimir. Un índice de texto completo puede incluir las columnas
char
,varchar
,nchar
,nvarchar
,text
,ntext
,image
,xml
,varbinary
yvarbinary(max)
columnas. Para obtener más información, vea Crear y administrar índices de texto completo.
Antes de aprender a crear índices de texto completo, es importante tener en cuenta cómo difieren de los índices de SQL Server normales. En la tabla siguiente se muestran las diferencias.
Índices de texto completo | Índices normales de SQL Server |
---|---|
Solo se permite un índice de texto completo por cada tabla. | Se permiten varios índices normales por cada tabla. |
La adición de datos a los índices de texto completo, operación que recibe el nombre de rellenado, puede solicitarse mediante una programación o una solicitud específica, o bien realizarse automáticamente al agregar nuevos datos. | Se actualizan automáticamente cuando se insertan, actualizan o eliminan los datos en los que están basados. |
Se agrupan en la misma base de datos en uno o más catálogos de texto completo. | No se agrupan. |
Elegir opciones para un índice de texto completo
En esta sección, se trata lo siguiente:
Elegir el idioma de la columna
Elegir un grupo de archivos para un índice de texto completo
Asignar el índice de texto completo a un catálogo de texto completo
Asociar una lista de palabras irrelevantes con el índice de texto completo
Actualizar un índice de texto completo
Elegir el idioma de la columna
Para obtener información sobre lo que hay que tener en cuenta para elegir el idioma de columna, vea Elegir un idioma al crear un índice de texto completo.
Elegir un grupo de archivos para un índice de texto completo
El proceso de creación de un índice de texto completo es bastante intensivo de E/S (en un nivel alto, consiste en leer datos de SQL Server y, a continuación, propagar los datos filtrados al índice de texto completo). Como práctica recomendada, busque en el grupo de archivos de bases de datos el índice de texto completo que mejor maximice el rendimiento de E/S o busque los índices de texto completo en un grupo de archivos diferente de otro volumen.
Si considera importante que la tarea de administración resulte sencilla, le recomendamos que almacene los datos de tabla y todos los catálogos de texto completo asociados en el mismo grupo de archivos. A veces, por razones de rendimiento, es posible que le interese tener los datos de tabla y el índice de texto completo en grupos de archivos diferentes almacenados en volúmenes diferentes para maximizar el paralelismo de E/S.
Asignar el índice de texto completo a un catálogo de texto completo
Es importante planear la colocación de los índices de texto completo para las tablas en los catálogos de texto completo.
Recomendamos asociar las tablas que tienen las mismas características de actualización (como un número reducido de cambios frente a un número elevado de cambios, o tablas que suelen cambiar durante un período determinado del día) bajo el mismo catálogo de texto completo. Al configurar la programación del rellenado de catálogos de texto completo, los índices de texto completo permanecen sincronizados con las tablas sin que ello afecte negativamente al uso de los recursos del servidor de bases de datos en momentos en los que la actividad de la base de datos es más intensa.
Cuando asigne una tabla a un catálogo de texto completo, tenga en cuenta las indicaciones siguientes:
Seleccione siempre el índice exclusivo más pequeño disponible para la clave exclusiva de texto completo. (Un índice basado en enteros de 4 bytes es óptimo). Esto reduce significativamente los recursos requeridos por Microsoft servicio Search en el sistema de archivos. Si la clave principal es grande (más de 100 bytes), considere la posibilidad de elegir otro índice exclusivo en la tabla (o de crear otro índice exclusivo) como clave exclusiva de texto completo. Si, por el contrario, el tamaño de la clave exclusiva de texto completo supera el tamaño máximo permitido (900 bytes), no se podrá realizar un rellenado de texto.
Si indiza una tabla con millones de filas, asigne la tabla a su propio catálogo de texto completo.
Tenga en cuenta la cantidad de cambios que se producen en las tablas con índices de texto completo, así como el número total de filas. Si el número total de filas que van a cambiar, junto con el número de filas existentes en la tabla durante el último rellenado de texto, asciende a varios millones, asigne a la tabla su propio catálogo de texto completo.
Asociar una lista de palabras irrelevantes con el índice de texto completo
SQL Server 2008 presenta listas de palabras irrelevantes. Una lista de palabras irrelevantes es una lista de palabras sin importancia. Cada índice de texto completo tiene asociada una lista de palabras irrelevantes, y las palabras de dicha lista se aplican a las consultas de texto completo que se realizan en ese índice. De forma predeterminada, a cada índice de texto completo nuevo se asocia la lista de palabras irrelevantes del sistema. Sin embargo, puede crear y usar su propia lista de palabras irrelevantes. Para obtener más información, vea Configurar y administrar palabras irrelevantes y listas de palabras irrelevantes para la búsqueda de texto completo.
Por ejemplo, la siguiente instrucción CREATE FULLTEXT STOPLISTtransact-SQL crea una nueva lista de palabras irrelevantes de texto completo denominada myStoplist3 copiando desde la lista de palabras irrelevantes del sistema:
CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO
La siguiente instrucción ALTER FULLTEXT STOPLISTtransact-SQL modifica una lista de palabras irrelevantes denominada myStoplist, agregando la palabra "en", primero para español y, a continuación, para francés:
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO
Actualizar un índice de texto completo
Al igual que los índices normales de SQL Server , los índices de texto completo se pueden actualizar automáticamente cuando se modifican los datos de las tablas asociadas. Este es el comportamiento predeterminado. Como alternativa, puede mantener actualizados los índices de texto completo de forma manual o durante los intervalos programados especificados. Rellenar un índice de texto completo puede consumir mucho tiempo y muchos recursos, por lo que, normalmente, la actualización del índice se realiza como un proceso asincrónico que se ejecuta en segundo plano para mantenerlo al día después de haber llevado a cabo modificaciones en la tabla base. Actualizar un índice de texto completo inmediatamente después de cada cambio realizado en la tabla base puede consumir muchos recursos. Por tanto, si el porcentaje de actualizaciones, inserciones y eliminaciones es muy elevado, es posible que experimente una disminución en el rendimiento de las consultas. Si se da esta situación, plantéese la posibilidad de programar las actualizaciones provocadas por el seguimiento de cambios manual; es decir, en lugar de disputarse los recursos con las consultas, lleve a cabo una actualización de vez en cuando.
Para supervisar el estado del rellenado, use las funciones FULLTEXTCATALOGPROPERTY u OBJECTPROPERTYEX. Para obtener el estado del rellenado del catálogo, ejecute la instrucción siguiente:
SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');
Normalmente, si se está realizando un rellenado completo, el resultado devuelto es 1.
Ejemplo: configurar la búsqueda de texto completo
En el siguiente ejemplo de dos partes se crea un catálogo de texto completo denominado AdvWksDocFTCat
en la base de datos AdventureWorks y, a continuación, se crea un índice de texto completo en la Document
tabla de AdventureWorks2012. Esta instrucción creará el catálogo de texto completo en el directorio predeterminado especificado durante la configuración. La carpeta denominada AdvWksDocFTCat
se encuentra en el directorio predeterminado.
Para crear un catálogo de texto completo denominado
AdvWksDocFTCat
, en el ejemplo se usa una instrucción CREATE FULLTEXT CATALOG :USE AdventureWorks; GO CREATE FULLTEXT CATALOG AdvWksDocFTCat;
Para crear un índice de texto completo en la tabla Document, antes debe asegurarse de que dicha tabla tiene un índice único, de una sola columna y que no admite valores NULL. La siguiente instrucción CREATE INDEX crea un índice único,
ui_ukDoc
, en la columna DocumentID de la tabla Document:CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
Después de tener una clave única, puede crear un índice de texto completo en la tabla
Document
mediante la siguiente instrucción CREATE FULLTEXT INDEX .CREATE FULLTEXT INDEX ON Production.Document ( Document --Full-text index column name TYPE COLUMN FileExtension --Name of column that contains file type information Language 2057 --2057 is the LCID for British English ) KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index WITH CHANGE_TRACKING AUTO --Population type; GO
El elemento TYPE COLUMN definido en este ejemplo especifica la columna de tipo de la tabla que contiene el tipo del documento en cada fila de la columna "Document" (que es del tipo binario). La columna de tipo almacena la extensión de archivo proporcionada por el usuario-".doc", ".xls", etc. del documento en una fila determinada. El motor de búsqueda de texto completo utiliza la extensión de archivo almacenada en una fila determinada para invocar el filtro adecuado para analizar los datos de esa fila. Después de que el filtro haya analizado los datos binarios de la fila, el separador de palabras especificado analizará el contenido (en este ejemplo, se usa el separador de palabras para inglés del Reino Unido). Tenga en cuenta que el proceso de filtrado solo tiene lugar durante la indización o cuando un usuario inserta o actualiza una columna de la tabla base mientras está habilitado el seguimiento de cambios automático para el índice de texto completo asociado. Para obtener más información, vea Configurar y administrar filtros para búsquedas.
Tareas comunes
Para crear un catálogo de texto completo
Para ver los índices de una tabla (o vista)
Para crear un índice único
Para crear un índice de texto completo
Para ver información acerca de un índice de texto completo
Catálogo o vista de administración dinámica | Descripción |
---|---|
sys.fulltext_index_catalog_usages (Transact-SQL) | Devuelve una fila por cada referencia de catálogo de texto completo a índice de texto completo. |
sys.fulltext_index_columns (Transact-SQL) | Contiene una fila para cada columna que forma parte de un índice de texto completo. |
sys.fulltext_index_fragments (Transact-SQL) | Un índice de texto completo utiliza tablas internas denominadas fragmentos de índice de texto completo para almacenar los datos de índice invertidos. Esta vista se puede utilizar para consultar los metadatos sobre estos fragmentos. Esta vista contiene una fila para cada fragmento de índice de texto completo en cada tabla que contiene un índice de texto completo. |
sys.fulltext_indexes (Transact-SQL) | Contiene una fila por índice de texto completo de un objeto tabular. |
sys.dm_fts_index_keywords (Transact-SQL) | Devuelve información sobre el contenido de un índice de texto completo para la tabla especificada. |
sys.dm_fts_index_keywords_by_document (Transact-SQL) | Devuelve información sobre el contenido de nivel de documento de un índice de texto completo para la tabla especificada. Una palabra clave determinada puede aparecer en varios documentos. |
sys.dm_fts_index_population (Transact-SQL) | Devuelve información acerca de los rellenados de índices de texto completo actualmente en progreso. |
Consulte también
CREATE FULLTEXT CATALOG (Transact-SQL)
CREATE FULLTEXT INDEX (Transact-SQL)
CREATE FULLTEXT STOPLIST (Transact-SQL)
CREATE TABLE (Transact-SQL)
Rellenar índices de texto completo
FULLTEXTCATALOGPROPERTY (Transact-SQL)
OBJECTPROPERTYEX (Transact-SQL)