Molte applicazioni eseguono query su un database per compilare una singola pagina nelle loro applicazioni. In questi casi, l'applicazione non ha bisogno di tutte le corrispondenze, ma solo delle corrispondenze migliori in base all'ordine di ordinamento dell'indice. Gli indici di ricerca possono implementare questo tipo di ricerca in modo molto efficiente. In questa pagina viene descritto come crea ed esegui la ricerca in un indice con corrispondenza top-k.
Crea indici di ricerca per le corrispondenze top-k
Per configurare un indice di ricerca per la corrispondenza top-k, utilizza ORDER BY
per ordinare la
l'indice di ricerca in base a una colonna specifica. Le query devono avere una clausola ORDER BY
che corrisponda esattamente all'ordine di ordinamento dell'indice di ricerca (inclusa la direzione crescente rispetto a quella decrescente) e una clausola LIMIT
che richieda l'interruzione della query dopo
aver trovato k righe corrispondenti.
Puoi anche implementare la paginazione utilizzando queste clausole. Per ulteriori informazioni, consulta Eseguire la paginazione delle query di ricerca.
Per alcuni casi d'uso, potrebbe avere senso mantenere più indici di ricerca. ordinate in base a colonne diverse. Mi piace partizionamento, c'è un compromesso tra costo di archiviazione e scrittura e latenza delle query.
Ad esempio, considera una tabella che utilizza lo schema seguente:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
RecordTimestamp INT64 NOT NULL,
ReleaseTimestamp INT64 NOT NULL,
ListenTimestamp INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsRecordTimestampIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens)
ORDER BY RecordTimestamp DESC
STORING ListenTimestamp
CREATE SEARCH INDEX AlbumsReleaseTimestampIndex
ON Albums(AlbumTitle_Tokens)
ORDER BY ReleaseTimestamp DESC
STORING ListenTimestamp
Esegui query su indici di ricerca per le corrispondenze top-k
Come indicato in precedenza, le query devono avere una clausola ORDER BY
che corrisponde esattamente all'ordinamento dell'indice di ricerca (incluso crescente o
direzione discendente) e una clausola LIMIT
che richiede l'interruzione della query dopo
trovare righe con corrispondenze K.
Di seguito sono riportate alcune query comuni:
La seguente query è molto efficiente. Seleziona Indice
AlbumsRecordTimestampIndex
. Anche se ci sono molti album con parola "happy", la query scansiona solo un numero limitato di righe:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp DESC LIMIT 10
La stessa query, richiedendo l'ordinamento per
ReleaseTimestamp
in ordine decrescente utilizza l'indiceAlbumsReleaseTimestampIndex
ed è uguale efficienza:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ReleaseTimestamp DESC LIMIT 10
Allo stesso tempo, una query che richiede l'ordinamento per
ListenTimestamp
non una query top-k in modo efficiente. Deve recuperare tutti gli album corrispondenti, ordinarli perListenTimestamp,
e restituire i 10 migliori. Una query di questo tipo utilizza più risorse se è presente un elevato numero di documenti che contengono "felice".SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ListenTimestamp DESC LIMIT 10`
Analogamente, una query non viene eseguita in modo efficiente se richiede che i risultati siano ordinati utilizzando la colonna
RecordTimestamp
in ordine crescente. Analizza tutti i contenuti righe con la parola "happy", nonostante abbia unLIMIT
.SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp ASC LIMIT 10
Passaggi successivi
- Scopri di più sulle query di ricerca a testo intero.
- Scopri come classificare i risultati di ricerca.
- Scopri come suddividere in pagine i risultati di ricerca.
- Scopri come combinare query full-text e non di testo.
- Scopri come eseguire ricerche in più colonne.