> Manuales > Tutorial de SQL

Cómo diseñar índices, consultas y sincronización de textos.

Consultas e índices de texto

El principal requisito de diseño de los índices, consultas y sincronización de texto es la presencia de una columna de clave exclusiva de texto (o clave principal de columna única) en todas las tablas que se registren para realizar búsquedas de texto. Un índice de texto realiza el seguimiento de las palabras significativas que más se usan y dónde se encuentran.

Por ejemplo, imagine un índice de texto para la tabla DevTools. Un índice de texto puede indicar que la palabra "Microsoft" se encuentra en la palabra número 423 y en la palabra 982 de la columna Abstract para la fila asociada con el ProductID igual a 6. Esta estructura de índices admite una búsqueda eficiente de todos los elementos que contengan palabras indizadas y operaciones de búsqueda avanzadas, como búsquedas de frases y búsquedas de proximidad.

Para impedir que los índices de texto se inunden con palabras que no ayudan en la búsqueda, las palabras innecesarias (vacías de significado), como "un", "y", "es" o "el", se pasan por alto. Por ejemplo, especificar la frase "los productos pedidos durante estos meses de verano" es lo mismo que especificar la frase "productos pedidos durante meses verano". Se devuelven las filas que contengan alguna de las cadenas.

En el directorio Mssql7FtdataSqlserverConfig se proporcionan listas de palabras que no son relevantes en las búsquedas de muchos idiomas. Este directorio se crea, y los archivos de palabras no relevantes se instalan, cuando se instala Microsoft® SQL Server™ con la funcionalidad de búsqueda de texto. Los archivos de palabras no relevantes se pueden modificar. Por ejemplo, los administradores del sistema de las empresas de alta tecnología podrían agregar la palabra "sistema" a su lista de palabras no relevantes. (Si modifica un archivo de palabras no relevantes, debe volver a rellenar los catálogos de texto para que los cambios surtan efecto). Consulte la ayuda de SQL-SERVER para conocer los correspondientes ficheros.

Cuando se procesa una consulta de texto, el motor de búsqueda devuelve a Microsoft SQL Server los valores de clave de las filas que coinciden con los criterios de búsqueda. Imagine una tabla CienciaFicción en la que la columna NúmLibro es la columna de clave principal:

NúmLibroEscritor Título
A025Asimov Los límites de la fundación
A027AsimovFundación e imperio
C011Clarke El fin de la infancia
V109Verne La isla misteriosa

Suponga que desea usar una consulta de recuperación de texto para buscar los títulos de los libros que incluyen la palabra Fundación. En este caso, del índice de texto se obtienen los valores A025 y A027. SQL Server usa, a continuación, estas claves y el resto de la información de los campos para responder a la consulta.

Componentes de las consultas de texto de Transact-SQL

Microsoft® SQL Server™ proporciona estos componentes de Transact-SQL para las consultas de texto:

Predicados de Transact-SQL:

Los predicados CONTAINS y FREETEXT se pueden usar en cualquier condición de búsqueda (incluida una cláusula WHERE) de una instrucción SELECT.

Funciones de conjuntos de filas de Transact-SQL:

Las funciones CONTAINSTABLE y FREETEXTTABLE se pueden usar en la cláusula FROM de una instrucción SELECT.

Propiedades de texto de Transact-SQL:

Éstas son algunas de las propiedades que se usan con las consultas de texto y las funciones que se utilizan para obtenerlas:

Procedimientos de texto almacenados del sistema de Transact-SQL:
Estos procedimientos almacenados se pueden usar en conjunción con la escritura de una consulta. Por ejemplo, puede usarlos para buscar los nombres de las columnas indizadas de texto de una tabla y el identificador de una columna de clave única de texto antes de especificar una consulta.

Funciones de conjunto de filas CONTAINSTABLE y FREETEXTTABLE

Las funciones CONTAINSTABLE y FREETEXTTABLE se usan para especificar las consultas de texto que devuelve la clasificación por porcentaje de aciertos de cada fila. Estas funciones son muy similares a los predicados de texto CONTAINS y FREETEXT, pero se utilizan de forma diferente.

Aunque tanto los predicados de texto como las funciones de conjunto de filas de texto se usan para las consultas de texto y la instrucción TRANSACT-SQL usada para especificar la condición de búsqueda de texto es la misma en los predicados y en las funciones, hay importantes diferencias en la forma en la que éstas se usan:

CONTAINS y FREETEXT devuelven ambos el valor TRUE o FALSE, con lo que normalmente se especifican en la cláusula WHERE de una instrucción SELECT. Sólo se pueden usar para especificar los criterios de selección, que usa Microsoft® SQL SERVER para determinar la pertenencia al conjunto de resultados.

CONTAINSTABLE y FREETEXTTABLE devuelven ambas una tabla de cero, una o más filas, con lo que deben especificarse siempre en la cláusula FROM.Se usan también para especificar los criterios de selección. La tabla devuelta tiene una columna llamada KEY que contiene valores de claves de texto. Cada tabla de texto registrada tiene una columna cuyos valores se garantizan como únicos. Los valores devueltos en la columna KEY de CONTAINSTABLE o FREETEXTTABLE son los valores únicos, procedentes de la tabla de texto registrada, de las filas que coinciden con los criterios de selección en la condición de búsqueda de texto.

Además, la tabla que producen CONTAINSTABLE y FREETEXTTABLE tiene una columna denominada RANK, que contiene valores de 0 a 1000. Estos valores se utilizan para ordenar las filas devueltas de acuerdo al nivel de coincidencia con los criterios de selección.

Las consultas que usan las funciones CONTAINSTABLE y FREETEXTTABLE son más complejas que las que usan los predicados CONTAINS y FREETEXT porque las filas que cumplen los criterios y que son devueltas por las funciones deben ser combinadas explícitamente con las filas de la tabla original de SQL SERVER.

CONTAINSTABLE (T-SQL)

Devuelve una tabla con cero, una o más filas para aquellas columnas de tipos de datos carácter que contengan palabras o frases en forma precisa o "aproximada" (menos precisa), la proximidad de palabras medida como distancia entre ellas, o coincidencias medidas. A CONTAINSTABLE se le puede hacer referencia en una cláusula FROM de una instrucción SELECT como si fuera un nombre de tabla normal.

Las consultas que utilizan CONTAINSTABLE especifican consultas de texto contenido que devuelven un valor de distancia (RANK) por cada fila. La función CONTAINSTABLE utiliza las mismas condiciones de búsqueda que el predicado CONTAINS.

Sintaxis

CONTAINSTABLE (tabla, {columna | *}, '<condiciónBúsquedaContenido>')
<condiciónBúsqueda> ::=
{
| <términoGeneración>
| <términoPrefijo>
| <términoProximidad>
| <términoSimple>
| <términoPeso>
}
| { (<condiciónBúsqueda>)
{AND | AND NOT | OR} <condiciónBúsqueda> [...n]
}
<términoPeso> ::=
ISABOUT
( { {
<términoGeneración>)
| <términoPrefijo>)
| <términoProximidad>)
| <términoSimple>)
}
[WEIGHT (valorPeso)]
} [,...n]
)
<términoGeneración> ::=
FORMSOF (INFLECTIONAL, <términoSimple> [,...n] )
<términoPrefijo> ::=
{ "palabra * " | "frase * " }
<términoProximidad> ::=
{<términoSimple> | <términoPrefijo>}
{ {NEAR | ~} {<términoSimple> | <términoPrefijo>} } […n]
<términoSimple> ::=
palabra | " frase "

Argumentos

tabla

Es el nombre de la tabla que ha sido registrada para búsquedas de texto. tabla puede ser el nombre de un objeto de una base de datos de una sola parte o el nombre de un objeto de una base de datos con varias partes. Para obtener más información, consulte Convenciones de sintaxis de Transact-SQL.

columna

Es el nombre de la columna que se va a examinar, que reside en tabla. Las columnas de tipos de datos de cadena de caracteres son columnas válidas para búsquedas de texto.

*

Especifica que todas las columnas de la tabla que se hayan registrado para búsquedas de texto se deben utilizar en las condiciones de búsqueda.

<condiciónBúsqueda>

Especifica el texto que se va a buscar en columna. En la condición de búsqueda no se puede utilizar variables.

palabra

Es una cadena de caracteres sin espacios ni signos de puntuación.

frase

Es una o varias palabras con espacios entre cada una de ellas.

Nota: Algunos idiomas, como los orientales, pueden tener frases que contengan una o varias palabras sin espacios entre ellas.

<términoPeso>

Especifica que las filas coincidentes (devueltas por la consulta) coincidan con una lista de palabras y frases a las que se asigna opcionalmente un valor de peso.

ISABOUT

Especifica la palabra clave <términoPeso>

WEIGHT (valorPeso)

Especifica el valor de peso como número entre 0,0 y 1,0. Cada componente de <términoPeso> puede incluir un valorPeso. valorPeso es una forma de modificar cómo varias partes de una consulta afectan al valor de distancia asignado a cada fila de la consulta. El peso hace una medida diferente de la distancia de un valor porque todos los componentes de se utilizan para determinar la coincidencia. Se devuelven las filas que contengan una coincidencia con cualquiera de los parámetros ISABOUT, aunque no tengan un peso asignado.

AND | AND NOT | OR

Especifica una operación lógica entre dos condiciones de búsqueda. Cuando <condiciónBúsqueda> contiene grupos entre paréntesis, dichos grupos entre paréntesis se evalúan primero. Después de evaluar los grupos entre paréntesis, se aplican las reglas siguientes cuando se utilizan estos operadores lógicos con condiciones de búsqueda:

<términoGeneración>

Especifica la coincidencia de palabras cuando los términos simples incluyen variaciones de la palabra original que se busca.

INFLECTIONAL

Especifica que se acepten las coincidencias de las formas plurales y singulares de los nombres y los distintos tiempos verbales. Un <términoSimple> dado dentro de un <términoGeneración> no coincide con nombres y verbos a la vez.

<términoPrefijo>

Especifica la coincidencia de palabras o frases que comiencen con el texto especificado. Enmarque el prefijo entre comillas dobles ("") y un asterisco (*) antes de la segunda comilla doble. Coincide todo el texto que comience por el término simple especificado antes del asterisco. El asterisco representa cero, uno o varios caracteres (de la palabra o palabras raíz de la palabra o la frase). Cuando <términoPrefijo> es una frase, todas las palabras de dicha frase se consideran prefijos. Por tanto, una consulta que especifique el prefijo "local wine *" hace que se devuelvan todas las filas que contengan el texto "local winery", "locally wined and dined", etc.

<términoProximidad>

Especifica la coincidencia de palabras o frases que estén cercanas entre ellas. <términoProximidad> opera de forma similar al operador AND: ambos requieren que existan varias palabras o frases en la columna examinada. Cuanto más próximas estén las palabras de <términoProximidad>, mejor será la coincidencia.

NEAR | ~

Indica que la palabra o frase del lado izquierdo del operador NEAR o ~ tiene que estar bastante cerca de la palabra o frase del lado derecho del operador NEAR o ~. Se pueden encadenar varios términos de proximidad, por ejemplo:

    a NEAR b NEAR c

Esto significa que la palabra o frase a tiene que estar cerca de la palabra o frase b, que, a su vez, tiene que estar cerca de la palabra o frase c.
Microsoft® SQL Server™ mide la distancia entre la palabra o frase izquierda y derecha. Un valor de distancia bajo (por ejemplo, 0) indica una distancia grande entre las dos. Si las palabras o frases especificadas están lejos unas de las otras, satisfacen la condición de la consulta; sin embargo, la consulta tiene un valor de distancia muy bajo (0). Sin embargo, si sólo consta de uno o varios términos de proximidad NEAR, SQL Server no devuelve filas con un valor de distancia de 0.

<términoSimple>

Especifica la coincidencia con una palabra exacta (uno o varios caracteres sin espacios o signos de puntuación en idiomas con caracteres de un solo byte) o una frase (una o varias palabras consecutivas separadas por espacios y signos de puntuación opcionales en idiomas con caracteres de un solo byte). Ejemplos de términos simples válidos son "blue berry", blueberry y "Microsoft SQL Server". Las frases tienen que ir entre comillas dobles (""). Las palabras de una frase tienen que aparecer en la columna de la base de datos en el mismo orden que el especificado en <condiciónBúsqueda>. La búsqueda de caracteres en la palabra o la frase distingue entre mayúsculas y minúsculas. Las palabras de una sola sílaba (como un, y, la) de las columnas de texto indizadas no se almacenan en los índices de los textos. Si únicamente se utiliza una de estas palabras en una búsqueda, SQL Server devuelve un mensaje de error indicando que en la consulta sólo hay monosílabos. SQL Server incluye una lista estándar de palabras monosílabas en el directorio Mssql7FtdataSqlserverConfig.
Los signos de puntuación se omiten. Por lo tanto, el valor "¿Dónde está mi equipo? satisface la condición CONTAINS(testing, "fallo del equipo") El fallo de la búsqueda sería grave.".

n

Es un marcador de posición que indica que se pueden especificar varias condiciones y términos de búsqueda.

Observaciones

CONTAINS no se reconoce como palabra clave si el nivel de compatibilidad es menor de 70. Para obtener más información, consulte sp_dbcmptlevel.

La tabla devuelta por la funcion CONTAINSTABLE tiene una columna llamada KEY que contiene valores de claves de texto. Todas las tablas con textos indizados tienen una columna cuyos valores se garantizan que son únicos y los valores devueltos en la columna KEY son los valores de claves de textos de las filas que satisfacen los criterios de selección especificados en la condición de búsqueda. La propiedad TableFulltextKeyColumn, obtenida mediante la función OBJECTPROPERTY, proporciona la identidad de esta columna de clave única. Para obtener las filas de la tabla original que desee, especifique una combinación con las filas de CONTAINSTABLE. La forma típica de la cláusula FROM de una instrucción SELECT que utilice CONTAINSTABLE es:

SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
ON FT_TBL.unique_key_column = KEY_TBL.[KEY]

La tabla que produce CONTAINSTABLE incluye una columna llamada RANK. La columna RANK es un valor (entre 0 y 1000) que para cada fila indica lo bien que cada una de ellas satisface los criterios de selección. Este valor de distancia se suele utilizar en las instrucciones SELECT de una de estas maneras:

CONTAINSTABLE no se reconoce como palabra clave si el nivel de compatibilidad es menor de 70. Para obtener más información, consulte sp_dbcmptlevel.

Ejemplos

A. Devolver valores de distancia mediante CONTAINSTABLE

Este ejemplo busca todos los nombres de productos que contengan las palabras "breads", "fish" o "beers", y los distintos pesos asignados a cada palabra. Por cada fila devuelta que cumpla los criterios de la búsqueda, se muestra la precisión relativa (valor de distancia) de la coincidencia. Además, las filas de mayor valor de distancia se devuelven primero.

USE Northwind
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
CONTAINSTABLE(Categories, Description,
'ISABOUT (breads weight (.8),
fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO

B. Devolver valores de distancia mayores que uno especificado mediante CONTAINSTABLE

Este ejemplo devuelve la descripción y el nombre de la categoría de todas las categorías de alimentos en las que la columna Description contenga las palabras "sweet" y "savory" cerca de la palabra "sauces" o de la palabra "candies". Todas las filas cuya categoría sea "Seafood" no se devuelven. Sólo se devuelven las filas cuyo grado de coincidencia sea igual o superior a 2.

USE Northwind
GO
SELECT FT_TBL.Description,
FT_TBL.CategoryName,
KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
CONTAINSTABLE (Categories, Description,
'("sweet and savory" NEAR sauces) OR
("sweet and savory" NEAR candies)'
) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC

C. Utilizar CONTAINS con <términoSimple>

Este ejemplo busca todos los productos cuyo precio sea $15,00 que contengan la palabra "bottles".

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
AND CONTAINS(QuantityPerUnit, 'bottles')
GO

D. Utilizar CONTAINS y una frase en <términoSimple>

Este ejemplo devuelve todos los productos que contengan la frase "sasquatch ale" o "steeleye stout".

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "Sasquatch ale" OR "steeleye stout" ')
GO

E. Utilizar CONTAINS con <términoPrefijo>

Este ejemplo devuelve todos los nombres de productos que tengan al menos una palabra que empiece por el prefijo "choc" en la columna ProductName.

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ') GO

F. Utilizar CONTAINS y OR con <términoPrefijo>

Este ejemplo devuelve todas las descripciones de categorías que contengan las cadenas "sea" o "bread".

USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO

G. Utilizar CONTAINS con <términoProximidad>

Este ejemplo devuelve todos los nombres de los productos que tengan la palabra "Boysenberry" cerca de la palabra "spread".

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO

H. Utilizar CONTAINS con <términoGeneración>

Este ejemplo busca todos los productos que tengan palabras derivadas de "dry": "dried", "drying", etc.

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO

I. Utilizar CONTAINS con <términoPeso>

Este ejemplo busca todos los nombres de productos que contengan las palabras "spread", "sauces" o "relishes", y los distintos pesos asignados a cada palabra.

USE Northwind
GO
SELECT CategoryName, Description
FROM Categories
WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8),
sauces weight (.4), relishes weight (.2) )' )
GO

FREETEXTTABLE

Devuelve una tabla de cero, una o varias filas cuyas columnas contienen datos de tipo carácter cuyos valores coinciden con el significado, no literalmente, con el texto especificado en cadenaTexto. Se puede hacer referencia a FREETEXTTABLE en las cláusula FROM de las instrucciones SELECT como a otro nombre de tabla normal.

Las consultas que utilizan FREETEXTTABLE especifican consultas de texto que devuelven el valor de coincidencia (RANK) de cada fila.

Sintaxis

FREETEXTTABLE (tabla, {columna | *}, 'cadenaTexto')

Argumentos

tabla

Es el nombre de la tabla que se ha marcado para búsquedas de texto. tabla puede ser el nombre de un objeto de una base de datos de una sola parte o el nombre de un objeto de una base de datos con varias partes.

columna

Es el nombre de la columna de tabla en la que se va a buscar. Las columnas cuyos datos sean del tipo de cadena de caracteres son columnas válidas para buscar texto.

*

Especifica que todas las columnas que hayan sido registradas para la búsqueda de texto se tienen que utilizar para buscar la cadenaTexto dada.

cadenaTexto

Es el texto que se va a buscar en la columna especificada. No se pueden utilizar variables.

Observaciones

FREETEXTTABLE utiliza las mismas condiciones de búsqueda que el predicado FREETEXT.Al igual que en CONTAINSTABLE, la tabla devuelta tiene columnas llamadas KEY y RANK, a las que se hace referencia en la consulta para obtener las filas apropiadas y utilizar los valores de distancia.FREETEXTTABLE no se reconoce como palabra clave si el nivel de compatibilidad es menor que 70. Para obtener más información, consulte sp_dbcmptlevel.

Ejemplos

En este ejemplo se devuelve el nombre y la descripción de todas las categorías relacionadas con “sweet”, “candy”, “bread”, “dry” y “meat”.

USE Northwind
SELECT FT_TBL.CategoryName,
FT_TBL.Description,
KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
FREETEXTTABLE(Categories, Description,
'sweetest candy bread and dry meat') AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
GO

Claudio

Manual