Clasifica los resultados de la búsqueda

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 relevancia temática, 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.

El siguiente ejemplo 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, aproximadamente, en la frecuencia del término: documento inverso (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 del IDF de TF/IDF solo está disponible cuando enhance_query=>true está en uso. que calcula la frecuencia relativa de las palabras en función de todo el corpus web que usa la Búsqueda de Google, en lugar de un 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 devuelve valores que sirven como puntuaciones de relevancia que Spanner usa para establecer un orden de clasificación. No tienen un significado independiente. Cuanto más alta es la puntuación, mejor coincide con la consulta.

Por lo general, los argumentos como query y enhance_query son iguales en ambos Funciones SEARCH y SCORE para garantizar la coherencia en la recuperación y la 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 puntuaciones a varias columnas

Spanner usa SCORE para calificar cada campo individualmente. Luego, la consulta combina estas puntuaciones individuales juntas. Una forma común de hacer esto es sumar puntuaciones individuales y, luego, potenciarlas en función de las ponderaciones de campo proporcionadas por el usuario (proporcionadas mediante 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).
  • Popularity(PopularityBoost) aumenta la puntuación multiplicándola por el factor (1 + IF(HasGrammy, @grammyweight, 0).

Para facilitar la lectura, 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

Mejora el orden de las coincidencias de consultas

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. Hay hay dos versiones de esta mejora: concordancia parcial y concordancia exacta. Se aplica un aumento de coincidencia parcial en los siguientes casos:

  1. La TOKENLIST contiene todos los términos originales de la consulta.
  2. Los tokens son 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 un aumento de coincidencia parcial.
  • Una consulta con una conjunción recibe un aumento si es parte de la conjunción aparezca en las ubicaciones adecuadas.
  • Una consulta con una frase recibe un boost si la frase aparece en el TOKENLIST, y el término a la izquierda de la frase en la consulta parece ser la izquierda de la frase en TOKENLIST, 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 boosting
Puente sobre otro cuerpo de agua sin boosting
Puente (sobre agua O con problemas) sin boosting
Puente incentivo parcial
Puente (con problemas O agua) incentivo parcial
Bridge Over Troubled Water impulso exacto
Puente “sobre aguas turbulentas” Amplificación exacta
Agua de puente (“exceso problema” O término faltante) 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. Por lo general, las consultas de puntuación tienen dos límites:

  1. Límite de profundidad de recuperación: Es la cantidad máxima de filas que se deben puntuar.
  2. Límite de tamaño del conjunto de resultados: la cantidad máxima de filas que la consulta debe de retorno (en 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 particularmente bien si Spanner usa de clasificación para ordenar el índice.

¿Qué sigue?