Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Las funciones CONTAINSTABLE y FREETEXTTABLE devuelven una columna llamada RANK que contiene valores ordinales de 0 a 1.000 (valores de rango). Estos valores clasifican las filas según lo bien que encajen con los criterios de selección. Los valores de clasificación solo indican un orden relativo de relevancia de las filas en el conjunto de resultados, con un valor inferior que indica la relevancia menor. Los valores reales no son importantes y normalmente varían cada vez que se ejecuta la consulta.
Nota:
Los predicados CONTAINS y FREETEXT no devuelven ningún valor de clasificación.
El número de elementos que coincide con una condición de búsqueda suele ser grande. Para evitar que las consultas de CONTAINSTABLE o FREETEXTTABLE devuelvan demasiadas coincidencias, utiliza el parámetro opcional top_n_by_rank. Solo devuelve un subconjunto de filas.
top_n_by_rank es un valor entero, n, que especifica que solo se devuelven las n coincidencias con la clasificación más alta, en orden descendente. Si se combina top_n_by_rank con otros parámetros, es posible que la consulta devuelva menos filas de las que en realidad coinciden con todos los predicados.
El Motor de base de datos de SQL Server ordena las coincidencias por rango y solo devuelve hasta el número especificado de filas. Por ejemplo, una consulta que normalmente devuelve 100.000 filas de una tabla de 1.000.000 de filas se procesa más rápido si solo se solicitan las 100 filas superiores.
Ejemplos de usar RANK para limitar los resultados de búsqueda
Ejemplo A: buscar solo las tres primeras coincidencias
En el ejemplo siguiente se usa CONTAINSTABLE para devolver las tres primeras coincidencias.
USE AdventureWorks2025;
GO
SELECT K.RANK,
AddressLine1,
City
FROM Person.Address AS A
INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON A.AddressID = K.[KEY];
GO
Este es el conjunto de resultados.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
Ejemplo B: Búsqueda de las cinco primeras coincidencias
En el ejemplo siguiente se utiliza CONTAINSTABLE para devolver la descripción de los 5 productos más destacados, donde la columna Description contiene la palabra “aluminum” cerca de la palabra light o de la palabra lightweight.
USE AdventureWorks2025;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription,
Description, '(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
Cómo se clasifican los resultados de la consulta de búsqueda
La búsqueda en texto completo puede generar una puntuación opcional (o valor de rango) que indica la relevancia de los datos devueltos por una consulta en texto completo. Este valor de rango se calcula en cada fila y puede usarse como criterio de ordenación para ordenar el conjunto de resultados de una consulta dada según su relevancia. Los valores de clasificación solo indican un orden de importancia relativa de las filas en el conjunto de resultados. Los valores reales carecen de relevancia y normalmente difieren cada vez que se ejecuta la consulta. El valor de clasificación no tiene importancia en las consultas.
Estadísticas de clasificación
Cuando construyes un índice, el sistema recopila estadísticas para usar en el ranking. Construir un catálogo de texto completo no crea directamente una única estructura de índice. En su lugar, el Full-Text Engine crea índices intermedios mientras indexa los datos. El motor de búsqueda de texto completo combina después dichos índices en un índice mayor, según sea necesario. Este proceso puede ocurrir muchas veces. A continuación, el motor de búsqueda de texto completo realiza una "mezcla maestra" que combina todos los índices intermedios en un gran índice maestro.
En cada índice intermedio se recopilan estadísticas, Las estadísticas se fusionan cuando se fusionan los índices. Algunos valores estadísticos solo pueden generarse durante el proceso de mezcla maestra.
Aunque el Motor de base de datos clasifica un conjunto de resultados de consultas, utiliza estadísticas del índice intermedio más grande. Este uso depende de si se fusionan los índices intermedios. Como resultado, las estadísticas de clasificación serán más o menos precisas si no se han combinado los índices intermedios. Esta diferencia en precisión explica por qué la misma consulta puede devolver resultados de rango diferentes a lo largo del tiempo a medida que se añaden, modifican y eliminan datos indexados en texto completo, y cuando se fusionan los índices más pequeños.
Para minimizar el tamaño del índice y la complejidad del cálculo, se suelen redondear las estadísticas.
En la siguiente lista se mencionan algunos términos y valores estadísticos de uso frecuente que son importantes para calcular la clasificación.
| Término/valor | Descripción |
|---|---|
| Propiedad | Una columna de la fila con índice de texto completo. |
| Document | Entidad que se devuelve en las consultas. En el Motor de base de datos esto corresponde a una fila. Un documento puede tener varias propiedades, de igual forma que una fila puede tener varias columnas indizadas de texto completo. |
| Índice | Un único índice invertido de uno o varios documentos. Puede almacenarse completamente en la memoria o en disco. Muchas estadísticas de consultas son relativas al índice individual donde se produjo la coincidencia. |
| Catálogo de texto completo | Colección de índices intermedios que se considera como una sola entidad en las consultas. Los catálogos son lo que los administradores ven como la unidad de organización. |
| Palabra, token o elemento | La unidad de coincidencia en el motor de texto completo. Los flujos de texto procedentes de documentos se tokenizan en palabras o tokens mediante segmentadores de palabras específicos de cada idioma. |
| Ocurrencia | Desplazamiento de las palabras en una propiedad de documento, tal y como lo determina el separador de palabras. La primera palabra está en la posición 1, la siguiente en la 2, y así sucesivamente. Para evitar falsos positivos en consultas de frase y proximidad, el final de la frase y el final del párrafo introducen mayores brechas de ocurrencia. |
| TermFrequency | El número de veces que el valor de clave aparece de forma consecutiva. |
| IndexedRowCount | Número total de filas indizadas. Este valor se calcula en base a los recuentos mantenidos en los índices intermedios. Este número puede ser más o menos preciso. |
| KeyRowCount | Número total de filas del catálogo de texto completo que contienen una determinada clave. |
| MaxOccurrence | Número máximo de repeticiones de una determinada propiedad de una fila, almacenadas en un catálogo de texto completo. |
| MaxQueryRank | El rango máximo, 1000, devuelto por la Full-Text Engine. |
Problemas en el cálculo del rango
Muchos factores afectan el proceso de cálculo del rango. Los divisores de palabras de distintos idiomas tokenizan el texto de forma diferente. Por ejemplo, un separador de palabras divide la cadena "dog-house" en "dog" y "house", pero otro separador de palabras la trata como "dog-house". La coincidencia y la clasificación varían según el idioma especificado, porque no solo las palabras son diferentes, sino también la longitud del documento. La diferencia de longitud del documento puede afectar a las categorías de todas las consultas.
Las estadísticas como IndexRowCount pueden variar enormemente. Por ejemplo, si un catálogo tiene 2.000 millones de filas en el índice maestro, un documento nuevo se indexa en un índice intermedio en memoria, y los rangos de ese documento basados en el número de documentos en el índice en memoria podrían estar sesgados en comparación con los rangos de los documentos del índice maestro. Por esta razón, después de cualquier operación de relleno que genere un gran número de filas indexadas o reindexadas, fusione los índices en un índice maestro mediante la instrucción Transact-SQL ALTER FULLTEXT CATALOG ... REORGANIZE. El motor de búsqueda de texto completo también combinará automáticamente los índices basándose en parámetros como el número y el tamaño de los índices intermedios.
Los valores deMaxOccurrence se normalizan en 1 de 32 intervalos. Esta normalización significa, por ejemplo, que un documento de 50 palabras se trata igual que un documento de 100 palabras. La siguiente tabla muestra la normalización. Dado que las longitudes del documento están en la clasificación entre los valores de tabla adyacentes 32 y 128, se tratan eficazmente como si tuvieran la misma longitud, 128 (32<docLength<= 128).
{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585,
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363,
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };
Clasificación de CONTAINSTABLE
La clasificación deCONTAINSTABLE usa el algoritmo siguiente:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
Las coincidencias de frases se ordenan igual que las claves individuales, excepto que KeyRowCount (el número de filas que contienen la frase) es un valor estimado que puede ser inexacto y superior al número real.
Clasificación de NEAR
CONTAINSTABLE admite las consultas de dos o más términos de búsqueda que estén próximos, mediante la opciónNEAR. El valor de rango de cada fila devuelta se basa en varios parámetros. Un factor importante de clasificación es el número total de coincidencias (o ocurrencias) en relación con la longitud del documento. Por ejemplo, si un documento de 100 palabras y un documento de 900 palabras contienen las mismas coincidencias, el de 100 palabras tiene un rango superior.
La longitud total de cada acierto en una fila también contribuirá a la clasificación de esa fila en función de la distancia entre los términos de búsqueda primero y último de ese acierto. Cuanto menor sea la distancia, más contribuye el acierto al valor de clasificación de la fila. Si una consulta en texto completo no especifica un entero como distancia máxima, un documento que contiene solo resultados cuyas distancias sean mayores a 100 términos lógicos tiene una clasificación de 0.
Clasificación de ISABOUT
CONTAINSTABLE permite consultar los términos ponderados utilizando la opciónISABOUT.
ISABOUT es lo que se denomina consulta de espacio vectorial en la terminología tradicional de recuperación de información. El algoritmo de clasificación predeterminado que se utiliza es Jaccard, una fórmula muy conocida. La clasificación se calcula para cada término de la consulta y se combina del modo que se describe en el algoritmo siguiente.
ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank = ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 )
+ ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )
Clasificación de FREETEXTTABLE
La clasificación deFREETEXTTABLE se basa en la fórmula de clasificación OKAPI BM25.
FREETEXTTABLE Las consultas añaden palabras a la consulta mediante generación flexiva (formas flexionadas de las palabras originales de consulta). Estas palabras se tratan como palabras separadas, sin una relación especial con las palabras de las que se generaron. Los sinónimos que se generan con la característica de diccionario de sinónimos se tratan como términos independientes del mismo peso. Cada palabra de la consulta contribuye al rango.
Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where:
w is the Robertson-Sparck Jones weight.
In simplified form, w is defined as:
w = log10 ( ( ( r + 0.5 ) * ( N - R + r + 0.5 ) ) / ( ( R - r + 0.5 ) * ( n - r + 0.5 ) )
N is the number of indexed rows for the property being queried.
n is the number of rows containing the word.
K is ( k1 * ( ( 1 - b ) + ( b * dl / avdl ) ) ).
dl is the property length, in word occurrences.
avdl is the average length of the property being queried, in word occurrences.
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively.
tf is the frequency of the word in the queried property in a specific row.
qtf is the frequency of the term in the query.