En esta página, se describe cómo clasificar los resultados de la búsqueda para las búsquedas de texto completo en Spanner.
Spanner admite el cálculo de una puntuación de topicalidad, que proporciona un elemento básico para crear funciones de clasificación sofisticadas. Estas puntuaciones calculan la relevancia de un resultado para una consulta, según la frecuencia del término de la consulta y otras opciones personalizables.
En el siguiente ejemplo, se muestra una búsqueda clasificada:
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "fifth symphony")
ORDER BY SCORE(AlbumTitle_Tokens, "fifth symphony") DESC
Asigna puntuaciones a los términos de búsqueda con la función SCORE
La función SCORE
calcula una puntuación para cada término de la consulta y, luego, combina las puntuaciones. La puntuación por término se basa, en términos generales, en la frecuencia de término y la frecuencia de documento inversa (TF/IDF). La puntuación es un componente del orden final de un registro. La consulta lo combina con otros indicadores, como la actualización que modula la puntuación de relevancia.
En la implementación actual, la parte de IDF de TF/IDF solo está disponible cuando se usa enhance_query=>true
. Calcula la frecuencia relativa de las palabras según el corpus web completo que usa la Búsqueda de Google, en lugar de un índice de búsqueda específico. Si no está habilitada la mejora de la consulta, la puntuación solo usa el componente de frecuencia del término (TF) (es decir, el término IDF se establece en 1).
La función SCORE
muestra valores que funcionan como puntuaciones de relevancia que Spanner usa para establecer un orden de clasificación. No tienen un significado independiente. Cuanto más alta sea la puntuación, mejor será la coincidencia con la búsqueda.
Por lo general, los argumentos como query
y enhance_query
son los mismos en las funciones SEARCH
y SCORE
para garantizar la coherencia en la recuperación y clasificación.
La forma recomendada de hacerlo es usar estos argumentos con parámetros de consulta en lugar de literales de cadena y especificar los mismos parámetros de consulta en las funciones SEARCH
y SCORE
.
Asigna puntuación a varias columnas
Spanner usa la función SCORE
para asignar una puntuación a cada campo de forma individual. Luego, la consulta combina estas puntuaciones individuales. Una forma común de hacerlo es sumar las puntuaciones individuales y, luego, aumentarlas según las ponderaciones de campo proporcionadas por el usuario (que se proporcionan con parámetros de consulta en SQL).
Por ejemplo, la siguiente consulta combina el resultado de dos funciones SCORE
:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY SCORE(Title_Tokens, @p1) * @titleweight + SCORE(Studio_Tokens, @p2) * @studioweight
LIMIT 25
En el siguiente ejemplo, se agregan dos parámetros de aumento:
- La actualización (
FreshnessBoost
) aumenta la puntuación con(1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30)
. - Popularidad(
PopularityBoost
) aumenta la puntuación multiplicándola por el factor(1 + IF(HasGrammy, @grammyweight, 0)
.
Para mejorar la legibilidad, la consulta usa el operador WITH
.
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY WITH(
TitleScore AS SCORE(Title_Tokens, @p1) * @titleweight,
StudioScore AS SCORE(Studio_Tokens, @p2) * @studioweight,
DaysOld AS (UNIX_MICROS(CURRENT_TIMESTAMP()) - ReleaseTimestamp) / 8.64e+10,
FreshnessBoost AS (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30),
PopularityBoost AS (1 + IF(HasGrammy, @grammyweight, 0)),
(TitleScore + StudioScore) * FreshnessBoost * PopularityBoost)
LIMIT 25
TOKENLIST_CONCAT
también se puede usar en la búsqueda y la puntuación para simplificar las consultas cuando corresponda:
SELECT AlbumId
FROM Albums
WHERE SEARCH(TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens]), @p)
ORDER BY SCORE(TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens]), @p)
LIMIT 25
Coincidencias de orden de la consulta de aumento
Puedes aplicar un aumento multiplicativo a la puntuación de topicalidad para los valores que contengan los términos de la consulta en el mismo orden en que aparecen en ella. Existen dos versiones de este aumento: la concordancia parcial y la concordancia exacta. Se aplica un aumento de coincidencia parcial en los siguientes casos:
TOKENLIST
contiene todos los términos originales de la búsqueda.- Los tokens están adyacentes entre sí y en el mismo orden en que aparecen en la consulta.
Existen ciertas reglas especiales para las conjunciones, las negaciones y las frases:
- Una consulta con una negación no puede recibir una mejora de concordancia parcial.
- Una consulta con una conjunción recibe un aumento si parte de la conjunción aparece en las ubicaciones adecuadas.
- Una consulta con una frase recibe una mejora si la frase aparece en
TOKENLIST
y el término a la izquierda de la frase en la consulta aparece a la izquierda de la frase enTOKENLIST
, y lo mismo se aplica al término a la derecha de la frase.
Spanner aplica una mejora de concordancia exacta cuando se cumplen todas las reglas anteriores. El primer y último token de la consulta son el primero y el último del documento.
Documento de ejemplo: Puente sobre aguas turbulentas
Consulta | Se aplicó el aumento |
---|---|
Bridge Troubled | sin aumento |
Puente sobre otro cuerpo de agua | sin aumento |
Puente (sobre O con problemas) sobre el agua | sin aumento |
Puente sobre | incentivo parcial |
Puente (en mal estado O sobre el agua) | incentivo parcial |
Bridge Over Troubled Water | Amplificación exacta |
Puente “sobre aguas turbulentas” | Amplificación exacta |
Puente ("Sobre aguas turbulentas" O missingterm) | Amplificación exacta |
Limita la profundidad de recuperación
Los índices de búsqueda suelen contener millones de documentos. En el caso de las consultas en las que los predicados tienen una baja selectividad, no es práctico clasificar todos los resultados. Las consultas de puntuación suelen tener dos límites:
- Límite de profundidad de recuperación: Es la cantidad máxima de filas que se deben calificar.
- Límite de tamaño del conjunto de resultados: Es la cantidad máxima de filas que debe mostrar la consulta (por lo general, el tamaño de la página).
Las consultas pueden limitar la profundidad de recuperación con subconsultas SQL:
SELECT *
FROM (
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1)
ORDER BY ReleaseTimestamp DESC
LIMIT @retrieval_limit
)
ORDER BY SCORE(Title_Tokens, @p1)
LIMIT @page_size
Esto funciona muy bien si Spanner usa el indicador de clasificación más importante para ordenar el índice.
¿Qué sigue?
- Obtén más información sobre las consultas de búsqueda de texto completo.
- Obtén más información para realizar una búsqueda de substring.
- Obtén más información para paginar los resultados de la búsqueda.
- Obtén información para combinar consultas de texto completo y no de texto.
- Obtén más información para buscar en varias columnas.