En esta página se describe cómo clasificar los resultados de búsqueda de búsquedas de texto completo en Spanner.
Spanner admite el cálculo de una puntuación de actualidad, que proporciona un componente básico para crear funciones de clasificación sofisticadas. Estas puntuaciones calculan la relevancia de un resultado para una consulta en función de la frecuencia del término de consulta y otras opciones personalizables.
En el siguiente ejemplo se muestra cómo realizar una búsqueda clasificada mediante la función SCORE
:
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "fifth symphony")
ORDER BY SCORE(AlbumTitle_Tokens, "fifth symphony") DESC
PostgreSQL
En este ejemplo se usa spanner.search
con
spanner.score
.
SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'fifth symphony')
ORDER BY spanner.score(albumtitle_tokens, 'fifth symphony') DESC
Puntuación de los términos de consulta con la función SCORE
La función SCORE
calcula una puntuación para cada término de consulta y, a continuación, combina las puntuaciones. La puntuación por término se basa aproximadamente en la frecuencia de término-frecuencia de documento inversa (TF/IDF). La puntuación es un componente del orden final de un registro. La consulta la combina con otras señales, como la actualidad, que modula la puntuación de actualidad.
En la implementación actual, la parte IDF de TF/IDF solo está disponible cuando se usa enhance_query=>true
. Calcula la frecuencia relativa de las palabras en función del corpus web completo que usa la Búsqueda de Google, en lugar de un índice de búsqueda específico. Si la mejora de rquery no está habilitada, la puntuación solo usa el componente de frecuencia de 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 mayor sea la puntuación, mejor se ajustará a la consulta.
Normalmente, los argumentos como query
y enhance_query
son los mismos en las funciones SEARCH
y SCORE
para asegurar 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
.
Puntuación de varias columnas
Spanner usa la función SCORE
para puntuar cada campo de forma individual. A continuación, la consulta combina estas puntuaciones individuales. Una forma habitual de hacerlo es sumar las puntuaciones individuales y, a continuación, aumentarlas según los pesos de los campos proporcionados por el usuario (que se proporcionan mediante parámetros de consulta SQL).
Por ejemplo, la siguiente consulta combina la salida de dos funciones SCORE
:
GoogleSQL
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
PostgreSQL
En este ejemplo se usan los parámetros de consulta $1
y $2
, que están vinculados a "quinta sinfonía" y "blue note", respectivamente.
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, $1) AND spanner.search(studio_tokens, $2)
ORDER BY spanner.score(title_tokens, $1) * $titleweight
+ spanner.score(studio_tokens, $2) * $studioweight
LIMIT 25
En el siguiente ejemplo se añaden dos parámetros de impulso:
- 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 que la consulta sea más legible, se usa el operador WITH
.
GoogleSQL
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
PostgreSQL
En este ejemplo se usan los parámetros de consulta $1
, $2
, $3
, $4
, $5
y $6
, que están vinculados a los valores especificados para titlequery
, studioquery
, titleweight
, studioweight
, grammyweight
y freshnessweight
, respectivamente.
SELECT albumid
FROM
(
SELECT
albumid,
spanner.score(title_tokens, $1) * $3 AS titlescore,
spanner.score(studio_tokens, $2) * $4 AS studioscore,
(extract(epoch FROM current_timestamp) * 10e+6 - releasetimestamp) / 8.64e+10 AS daysold,
(1 + CASE WHEN hasgrammy THEN $5 ELSE 0 END) AS popularityboost
FROM albums
WHERE spanner.search(title_tokens, $1) AND spanner.search(studio_tokens, $2)
) AS subquery
ORDER BY (subquery.TitleScore + subquery.studioscore)
* (1 + $6 * greatest(0, 30 - subquery.daysold) / 30) * subquery.popularityboost
LIMIT 25
TOKENLIST_CONCAT
también se puede usar en las búsquedas y las puntuaciones para simplificar las consultas cuando
sea necesario.
GoogleSQL
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
PostgreSQL
En este ejemplo se usa
spanner.tokenlist_concat
.
El parámetro de consulta $1
está vinculado a "blue note".
SELECT albumid
FROM albums
WHERE spanner.search(spanner.tokenlist_concat(ARRAY[title_tokens, studio_tokens]), $1)
ORDER BY spanner.score(spanner.tokenlist_concat(ARRAY[title_tokens, studio_tokens]), $1)
LIMIT 25
Aumentar las coincidencias de orden de las consultas
Spanner aplica un aumento multiplicativo al resultado de la función SCORE
para los valores que contienen los términos de la consulta en el mismo orden en el que aparecen en la consulta. Hay dos versiones de este aumento: coincidencia parcial y coincidencia exacta. Se aplica un aumento de la coincidencia parcial cuando:
- El
TOKENLIST
contiene todos los términos originales de la consulta. - Los tokens están uno junto al otro y en el mismo orden en el que aparecen en la consulta.
Hay algunas reglas especiales para las conjunciones, las negaciones y las frases:
- Una consulta con una negación no puede recibir un aumento de la coincidencia parcial.
- Una consulta con una conjunción recibe un impulso si parte de la conjunción aparece en las ubicaciones adecuadas.
- Una consulta con una frase recibe un impulso si la frase aparece en el
TOKENLIST
, el término situado a la izquierda de la frase en la consulta aparece a la izquierda de la frase en elTOKENLIST
y lo mismo ocurre con el término situado a la derecha de la frase.
Spanner aplica un aumento de la concordancia exacta cuando se cumplen todas las reglas anteriores y los tokens primero y último de la consulta son los tokens primero y último del documento.
Documento de ejemplo: Bridge Over Troubled Water
Consulta | Potenciador aplicado |
---|---|
Bridge Troubled | Sin mejora |
Puente sobre - otro cuerpo de agua | Sin mejora |
Bridge (Over Troubled Water) | Sin mejora |
Bridge Over | impulso parcial |
Bridge Over (Troubled OR Water) | impulso parcial |
Bridge Over Troubled Water | amplificación exacta |
Bridge Over Troubled Water | amplificación exacta |
Bridge ("Over Troubled" OR missingterm) Water | amplificación exacta |
Limitar la profundidad de la recuperación
Los índices de búsqueda suelen contener millones de documentos. En las consultas en las que los predicados tienen una selectividad baja, 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: número máximo de filas que se van a puntuar.
- Límite del tamaño del conjunto de resultados: número máximo de filas que debe devolver la consulta (normalmente, el tamaño de página).
Las consultas pueden limitar la profundidad de recuperación con subconsultas SQL:
GoogleSQL
SELECT *
FROM (
SELECT AlbumId, Title_Tokens
FROM Albums
WHERE SEARCH(Title_Tokens, @p1)
ORDER BY ReleaseTimestamp DESC
LIMIT @retrieval_limit
)
ORDER BY SCORE(Title_Tokens, @p1)
LIMIT @page_size
PostgreSQL
En este ejemplo se usan los parámetros de consulta $1
, $2
y $3
, que están vinculados a los valores especificados para title_query
, retrieval_limit
y page_size
, respectivamente.
SELECT *
FROM (
SELECT albumid, title_tokens
FROM albums
WHERE spanner.search(title_tokens, $1)
ORDER BY releasetimestamp DESC
LIMIT $2
) AS subquery
ORDER BY spanner.score(subquery.title_tokens, $1)
LIMIT $3
Esto funciona especialmente bien si Spanner usa la señal de clasificación más importante para ordenar el índice.
Siguientes pasos
- Consulta información sobre las consultas de búsqueda de texto completo.
- Consulte cómo realizar una búsqueda de subcadenas.
- Consulta cómo paginar los resultados de búsqueda.
- Consulta cómo combinar consultas de texto completo y consultas que no son de texto.
- Consulta cómo buscar en varias columnas.