FREETEXT (Transact-SQL)
Es un predicado que se usa en una cláusula WHERE para buscar en columnas que contienen tipos de datos basados en caracteres valores que coincidan con el significado, pero no con las palabras exactas de la condición de búsqueda. Cuando se utiliza FREETEXT, el motor de consulta de texto completo realiza internamente las siguientes acciones en freetext_string, asigna a cada uno de los términos un peso y busca las coincidencias.
Separa la cadena en palabras individuales basándose en límites de palabras (separación de palabras).
Genera formas no flexionadas de las palabras (lematización).
Identifica una lista de expansiones o reemplazos de los términos basándose en coincidencias en el diccionario de sinónimos.
Sintaxis
FREETEXT ( { column_name | (column_list) | * }
, 'freetext_string' [ , LANGUAGE language_term ] )
Argumentos
column_name
Es el nombre de una o varias columnas indizadas de texto completo de la tabla especificada en la cláusula FROM. Las columnas pueden ser de tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary o varbinary(max).column_list
Indica que se pueden especificar varias columnas, separadas por una coma. column_list se debe incluir entre paréntesis. A menos que se especifique language_term, el idioma de todas las columnas de column_list debe ser el mismo.*
Especifica que todas las columnas que hayan sido registradas para la búsqueda de texto completo se tienen que utilizar para buscar la freetext_string determinada. Si en la cláusula FROM hay más de una tabla, * se tiene que especificar con el nombre de la tabla. A menos que se especifique language_term, el idioma de todas las columnas de la tabla debe ser el mismo.freetext_string
Es el texto que se va a buscar en column_name. Se puede escribir cualquier texto, incluidas palabras, frases y oraciones. Se generarán coincidencias si se encuentra algún término o las formas de algún término en el índice de texto completo.A diferencia de lo que sucede en la condición de búsqueda CONTAINS y CONTAINSTABLE, donde AND es una palabra clave, cuando la palabra "and" se utiliza en freetext_string, se considera una palabra irrelevante y no se tiene en cuenta.
No se permite el uso de WEIGHT, FORMSOF, caracteres comodín, NEAR y otros elementos sintácticos. freetext_string se separa en palabras, de las que se extraen las desinencias y se pasan por el diccionario de sinónimos.
freetext_string es de tipo nvarchar. Se realiza una conversión implícita cuando se usa otro tipo de datos de carácter como entrada. En el siguiente ejemplo, la variable @SearchWord, definida como una variable de tipo varchar(30), provoca una conversión implícita en el predicado FREETEXT.
USE AdventureWorks2008R2; GO DECLARE @SearchWord varchar(30) SET @SearchWord ='performance' SELECT Description FROM Production.ProductDescription WHERE FREETEXT(Description, @SearchWord);
Como el "examen de parámetros" no funciona con la conversión, use nvarchar para obtener mejor rendimiento. En el ejemplo, declare @SearchWord como nvarchar(30).
USE AdventureWorks2008R2; GO DECLARE @SearchWord nvarchar(30) SET @SearchWord = N'performance' SELECT Description FROM Production.ProductDescription WHERE FREETEXT(Description, @SearchWord);
También puede usar la sugerencia de consulta OPTIMIZE FOR para los casos en los que se genera un plan poco óptimo.
LANGUAGE language_term
Es el idioma cuyos recursos se utilizarán en la separación de palabras, la lematización, los diccionarios de sinónimos y la eliminación de palabras irrelevantes como parte de la consulta. Este parámetro es opcional y puede especificarse como valor de cadena, entero o hexadecimal correspondiente al identificador de configuración regional (LCID) de un idioma. Si se especifica language_term, el idioma que representa se aplica a todos los elementos de la condición de búsqueda. Si no se especifica ningún valor, se utiliza el idioma de texto completo de la columna.Si se almacenan juntos documentos de idiomas diferentes como objetos binarios grandes (BLOB) en una sola columna, el identificador de configuración regional (LCID) de un documento determinado determina qué idioma se usa para indizar su contenido. Al consultar este tipo de columna, especificar LANGUAGElanguage_term puede aumentar la probabilidad de encontrar una coincidencia acertada.
Si el valor especificado es una cadena, language_term corresponde al valor de columna alias de la vista de compatibilidad sys.syslanguages (Transact-SQL). La cadena debe ir entre comillas simples, como en 'language_term'. Si el valor especificado es un entero, language_term es el LCID real que identifica el idioma. Si se especifica como un valor hexadecimal, language_term es 0x seguido del valor hexadecimal del LCID. El valor hexadecimal no puede tener más de ocho dígitos, incluidos los ceros a la izquierda.
Si el valor está en formato DBCS (juego de caracteres de doble byte), Microsoft SQL Server lo convertirá a Unicode.
Si el idioma especificado no es válido o no hay recursos instalados que se correspondan con dicho idioma, Microsoft SQL Server devuelve un error. Para utilizar los recursos de idioma neutro, especifique 0x0 como language_term.
Comentarios
Los predicados y las funciones de texto completo operan en una única tabla, que se obtiene del predicado FROM. Para buscar en varias tablas, utilice una tabla combinada en la cláusula FROM para buscar en un conjunto de resultados que sea el producto de dos o más tablas.
Las consultas de texto completo que utilizan FREETEXT son menos precisas que las consultas de texto completo que utilizan CONTAINS. El motor de búsqueda de texto completo de SQL Server identifica las palabras y las frases importantes. No se le da significado especial a ninguna de las palabras clave reservadas o caracteres comodín que suelen tener significado cuando se especifican en el parámetro <contains_search_condition> del predicado CONTAINS.
FREETEXT no se reconoce como palabra clave si el nivel de compatibilidad es inferior a 70. Para obtener más información, vea sp_dbcmptlevel (Transact-SQL).
Los predicados de texto completo no se permiten en la cláusula OUTPUT cuando el nivel de compatibilidad de la base de datos está establecido en 100.
Comparación de LIKE con la búsqueda de texto completo
A diferencia de la búsqueda de texto completo, el predicado de LIKE Transact-SQL funciona solamente en patrones de caracteres. Además, no es posible utilizar el predicado de LIKE para consultar datos binarios con formato. Por otro lado, una consulta LIKE contra una cantidad grande de datos de texto no estructurados es mucho más lenta que una consulta de texto completo equivalente contra los mismos datos. Una consulta LIKE realizada en millones de filas de datos de texto puede tardar minutos en devolver resultados, mientras que una consulta de texto completo en los mismos datos puede tardar únicamente segundos, en función del número de filas que se devuelvan.
Ejemplos
A. Usar FREETEXT para buscar palabras que contengan los valores de carácter especificados
En el siguiente ejemplo se buscan todos los documentos que contienen las palabras relacionadas con "vital", "safety", "components".
USE AdventureWorks2008R2;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
B. Usar FREETEXT con variables
En el siguiente ejemplo se utiliza una variable en lugar de un término de búsqueda específico.
USE AdventureWorks2008R2;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
Vea también