Comparar funciones de texto y predicados de texto
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 pero se utilizan de forma distinta que los predicados de texto CONTAINS y FREETEXT.
Aunque tanto los predicados de texto como las funciones de texto se usan para las consultas de texto y la sintaxis que se utiliza para especificar la condición de búsqueda de texto es la misma en los predicados y en las funciones, hay importantes diferencias en el modo en que se utilizan. A continuación se describen algunas similitudes y diferencias importantes:
- CONTAINS y FREETEXT devuelven un valor TRUE o FALSE y se especifican en las cláusulas WHERE o HAVING de una instrucción SELECT.
- 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.
- CONTAINS y FREETEXT sólo se pueden usar para especificar los criterios de selección, que utiliza Microsoft SQL Server para determinar la pertenencia al conjunto de resultados.
- CONTAINSTABLE y FREETEXTTABLE 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 especificados en la condición de búsqueda de texto.
Además, la tabla producida por CONTAINSTABLE y FREETEXTTABLE tiene una columna llamada RANK, que contiene valores de 0 a 1000. Cuanto menor es el valor, menor es la importancia. Estos valores se utilizan para clasificar las filas devueltas en función del grado de coincidencia con los criterios de selección.
[!NOTA] El valor de distancia sólo indica un orden de importancia relativa de las filas en el conjunto de resultados. El valor real no tiene importancia y no debe esperarse que sea el mismo cada vez que se ejecuta la consulta. Para obtener más información acerca de la clasificación, vea Descripción de la clasificación.
Las consultas CONTAINS y FREETEXT no devuelven ningún valor de distancia.
Cuando se ejecutan consultas que utilizan las funciones CONTAINSTABLE y FREETEXTTABLE, las filas devueltas que cumplen los criterios deben combinarse de forma explícita con las filas de la tabla original de SQL Server.
El siguiente ejemplo devuelve la descripción y el nombre de categoría de todas las categorías de alimentos cuya columna Description contenga las palabras "sweet and savory" cerca de la palabra "sauces" o de la palabra "candies". Todas las filas cuyo nombre de categoría sea "Seafood" no se devuelven. Sólo se devuelven las filas cuyo valor de distancia sea igual o superior a 2.
[!NOTA] Para ejecutar algunos de los ejemplos de este tema, es necesario instalar la base de datos Northwind. Para obtener información acerca de cómo instalar la base de datos Northwind, vea Descargar las bases de datos de ejemplo Northwind y pubs.
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;
GO
Comparación entre CONTAINSTABLE y CONTAINS
La función CONTAINSTABLE y el predicado CONTAINS utilizan condiciones de búsqueda similares.
Sin embargo, en CONTAINSTABLE se especifica la tabla en la que tendrá lugar la búsqueda de texto, la columna (o todas las columnas) de la tabla en la que se buscará y la condición de búsqueda. Hay un parámetro opcional que permite al usuario indicar que sólo se devuelva el número máximo de coincidencias especificado. Para obtener más información, vea la sección "Limitar los conjuntos de resultados" de este tema.
CONTAINSTABLE devuelve una tabla que contiene una columna llamada RANK. Esta columna RANK contiene un valor para cada fila que indica el grado de coincidencia de cada fila con los criterios de selección. Cuanto mayor sea el valor de distancia de una fila, mayor importancia tendrá la fila en la consulta de texto determinada.
Comparación entre FREETEXTTABLE y FREETEXT
En la consulta siguiente se amplía una consulta FREETEXTTABLE para que devuelva primero las filas con clasificación superior y agregue la clasificación de cada fila a la lista de selección. Para especificar la consulta, debe saber que CategoryID es la columna de clave única de la tabla Categories.
USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL
INNER JOIN
FREETEXTTABLE(Categories, Description,
'How can I make my own beers and ales?') AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
Esto es una ampliación de la misma consulta que sólo devuelve las filas con un valor de distancia de 10 ó superior:
USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL
INNER JOIN
FREETEXTTABLE (Categories, Description,
'How can I make my own beers and ales?') AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO
Identificar el nombre de la columna de clave única
Cuando se escriben consultas que usan funciones de conjunto de filas, es necesario saber el nombre de la columna de clave única. Cada tabla habilitada para texto tiene la propiedad TableFulltextKeyColumn que contiene el Id. de la columna que ha sido seleccionada para exigir filas únicas en la tabla. En este ejemplo se muestra cómo obtener el nombre de la columna de clave mediante programación.
USE AdventureWorks;
GO
DECLARE @key_column sysname
SET @key_column = Col_Name(Object_Id('Production.Document'),
ObjectProperty(Object_id('Production.Document'),
'TableFulltextKeyColumn')
)
SELECT @key_column AS 'Unique Key Column';
GO
Limitar los conjuntos de resultados para devolver los resultados más relevantes
En muchas consultas de texto, hay un gran número de elementos que coinciden con la condición de búsqueda. Para evitar que las consultas devuelvan demasiadas coincidencias, utilice el argumento opcional top_n_by_rank en CONTAINSTABLE y FREETEXTTABLE para especificar el número de coincidencias, ordenadas, que desea que se devuelvan.
[!NOTA] Si utiliza el argumento top_n_by_rank, se devuelve un subconjunto de filas que satisface la consulta de texto. Si se combina top_n_by_rank con otros predicados, es posible que la consulta devuelva menos filas de las que en realidad coinciden con todos los predicados.
Con esta información, Microsoft SQL Server ordena las coincidencias por rango y devuelve sólo hasta el número especificado. Esta opción puede aumentar significativamente el rendimiento. Por ejemplo, una consulta que por lo general devolvería 100.000 filas de una tabla de 1 millón se procesará de forma más rápida si sólo se piden las 100 primeras filas.
Si sólo se desea que se devuelvan las 3 coincidencias principales del ejemplo anterior, mediante CONTAINSTABLE, la consulta tendrá esta forma:
USE Northwind;
GO
SELECT K.RANK, CompanyName, ContactName, Address
FROM Customers AS C
INNER JOIN
CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON C.CustomerID = K.[KEY];
GO
El siguiente es el conjunto de resultados:
RANK CompanyName ContactName address
---- ------------ ----------- -------
123 Bon app' Laurence Lebihan 12, rue des Bouchers
65 Du monde entier Janine Labrune 67, rue des Cinquante Otages
15 France restauration Carine Schmitt 54, rue Royale
Este ejemplo devuelve la descripción y el nombre de categoría de las 10 categorías de alimentos principales cuya columna Description contiene las palabras "sweet and savory" cerca de la palabra "sauces" o de la palabra "candies".
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)'
, 10
) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO
Vea también
Otros recursos
CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)