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 pertinenza, che fornisce un elemento costitutivo 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, "fifth symphony")
ORDER BY SCORE(AlbumTitle_Tokens, "fifth symphony") DESC
Assegnare un punteggio ai termini di query con la funzione SCORE
La SCORE
calcola un punteggio per ogni termine di query e poi combina
punteggi di valutazione. Il punteggio a termine si basa più o meno sul documento frequenza-inverso della frequenza dei termini
frequenza (TF/IDF). Il punteggio è uno dei componenti dell'ordinamento 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.
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 è la corrispondenza alla query.
Di solito argomenti come query
e enhance_query
sono gli stessi in entrambe
Le funzioni SEARCH
e SCORE
consentono di garantire la coerenza nel recupero e nel ranking.
Il modo consigliato per farlo è utilizzare questi argomenti con i parametri di query anziché con i valori letterali stringa.
e specificare gli stessi parametri di ricerca nelle funzioni SEARCH
e SCORE
.
Assegnare un punteggio a più colonne
Spanner utilizza la classe SCORE
per assegnare un punteggio a ogni campo singolarmente. La query combina quindi
i singoli punteggi insieme. Un modo comune per farlo è sommare i singoli punteggi e poi aumentarli in base ai pesi dei campi forniti dall'utente (forniti utilizzando i parametri di 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 fattore(1 + IF(HasGrammy, @grammyweight, 0)
.
Per una maggiore 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
TOKENLIST_CONCAT
può essere utilizzato anche nella ricerca e nel calcolo del punteggio per semplificare le query, se opportuno:
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
Aumenta le corrispondenze dell'ordine delle query
Puoi applicare un aumento moltiplicativo al punteggio di pertinenza per i valori che contengono i termini di query nello stesso ordine in cui appaiono nella query. Esistono due versioni di questo potenziamento: corrispondenza parziale e corrispondenza esatta. Un aumento per la corrispondenza parziale viene applicato quando:
TOKENLIST
contiene tutti i termini originali della query.- 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 nelTOKENLIST
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. I token primo e ultimo nella query sono i token primo e ultimo nel documento.
Documento di esempio: Bridge Over Troubled Water
Query | Boost applicato |
---|---|
Ponte con problemi | nessun miglioramento |
Ponte - altra acqua | nessun miglioramento |
Ponte d'acqua (over O disturbato) | nessuna spinta |
Bridge Over | boost parziale |
Ponte sull'acqua | boost parziale |
Bridge Over Troubled Water | aumento esatto |
Ponte "sopra acque agitate" | 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. Le query di punteggio hanno in genere due limiti:
- Limite di profondità di recupero: il numero massimo di righe a cui assegnare un punteggio.
- 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 il segnale di ranking più importante per ordinare l'indice.
Passaggi successivi
- Scopri di più sulle query di ricerca full-text.
- Scopri come eseguire una ricerca di sottostringhe.
- Scopri come suddividere in pagine i risultati di ricerca.
- Scopri come combinare query full-text e non di testo.
- Scopri come cercare in più colonne.