Ranking dei risultati di ricerca

In questa pagina viene descritto come posizionare i risultati di ricerca per ricerche di testo completo in Spanner.

Spanner supporta il calcolo di un punteggio di attualità, che fornisce un componente di base per la creazione di funzioni di ranking sofisticate. Questi punteggi Calcolano la pertinenza di un risultato rispetto a una query, in base al termine della query frequenza e altre opzioni personalizzabili.

L'esempio seguente mostra una ricerca classificata:

SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, @p)
ORDER BY SCORE(AlbumTitle_Tokens, @p) DESC

Assegnare un punteggio ai termini di query con la funzione SCORE

La funzione SCORE calcola un punteggio per ogni termine di query e poi combina i punteggi. Il punteggio per termine si basa approssimativamente sulla frequenza del termine e sulla frequenza inversa del documento (TF/IDF). Il punteggio è un componente dell'ordine finale di un record. La query li combina con altri indicatori, come l'aggiornamento che modula il punteggio di pertinenza.

Nell'implementazione attuale, la parte IDF di TF/IDF è disponibile solo quando È in uso enhance_query=>true. Calcola la frequenza relativa delle parole basati sull'intero corpus web utilizzato dalla Ricerca Google, anziché a un indice di ricerca specifico. Se il miglioramento rquery non è abilitato, solo il punteggio utilizza il componente della frequenza del termine (TF), ovvero il termine IDF è impostato su 1.

Di solito, l'opzione enhance_query è la stessa in SEARCH e SCORE.

La funzione SCORE restituisce valori che fungono da punteggi di pertinenza utilizzati da Spanner per stabilire un ordine di ordinamento. Non hanno modelli significato. Più alto è il punteggio, migliore sarà la corrispondenza con la query.

Assegna un punteggio a più colonne

Spanner utilizza la funzione SCORE per assegnare un punteggio a ogni campo individualmente. La query combina quindi questi singoli punteggi. Un comune per fare ciò è sommare i singoli punteggi e in base ai pesi dei campi forniti dall'utente (forniti utilizzando una query SQL ).

Ad esempio, la seguente query combina l'output di due funzioni 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

Nell'esempio seguente vengono aggiunti due parametri di boost:

  • L'aggiornamento (FreshnessBoost) aumenta il punteggio con (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30)
  • La popolarità (PopularityBoost) aumenta il punteggio moltiplicandolo per il fattore (1 + IF(HasGrammy, @grammyweight, 0).

Per la leggibilità, la query utilizza l'operatore 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

Aumenta le corrispondenze dell'ordine delle query

Puoi applicare un booster moltiplicativo al punteggio di attualità per i valori che contengono i termini della query nello stesso ordine in cui appaiono nella query. Là esistono due versioni di questo booster: corrispondenza parziale e corrispondenza esatta. Una corrispondenza parziale Il booster viene applicato quando:

  1. TOKENLIST contiene tutti i termini originali della query.
  2. I token sono adiacenti tra loro e nello stesso ordine in cui appaiono nella query.

Esistono alcune regole speciali per congiunzioni, negazioni e frasi:

  • Una query con un'espressione di negazione non può ricevere un miglioramento della corrispondenza parziale.
  • Una query con una congiunzione riceve un booster se parte della congiunzione vengono visualizzati nelle posizioni appropriate.
  • Una query con una frase viene migliorata se la frase compare nella TOKENLIST, e il termine a sinistra della frase nella query sembra essere a sinistra della frase nel TOKENLIST e lo stesso vale per il termine a destra della frase.

Spanner applica un miglioramento della corrispondenza esatta quando tutte le regole precedenti sono vere. Il primo e l'ultimo token della query sono il primo e l'ultimo token nel documento.

Documento di esempio: Ponte sull'acqua a rischio

Query Boost applicato
Problemi con il ponte nessuna spinta
Ponte - altra acqua nessuna spinta
Ponte d'acqua (over O disturbato) nessuna spinta
Ponte boost parziale
Ponte sull'acqua boost parziale
Ponte sull'acqua inquinata aumento esatto
Ponte "Over Problemd" Acqua aumento esatto
Ponte ("Se si è verificato un problema" O termine mancante) aumento esatto

Limita profondità di recupero

Gli indici di ricerca spesso contengono milioni di documenti. Per le query in cui i predicati hanno una bassa selettività, pertanto è impossibile classificare tutti i risultati. In genere, le query a livello di punteggio hanno due limiti:

  1. Limite di profondità di recupero: il numero massimo di righe da valutare.
  2. Limite di dimensioni del set di risultati: il numero massimo di righe che deve essere la query. (in genere le dimensioni della pagina).

Le query possono limitare la profondità di recupero con le sottoquery 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

Questo funziona particolarmente bene se Spanner utilizza la chiave indicatore di ranking per ordinare l'indice.

Passaggi successivi