Gli indici di ricerca possono indicizzare più colonne tokenizzate, rendendo più efficienti le query su queste colonne. Questa pagina descrive come eseguire una ricerca su più colonne, un tipo di ricerca full-text.
Eseguire una ricerca su più colonne
La struttura dell'indice di ricerca garantisce che le query non richiedano un'unione distribuita, garantendo prestazioni prevedibili delle query. Il join distribuito viene evitato a causa della collocazione di tutti i token che corrispondono a una riga della tabella di base nella stessa suddivisione.
Ad esempio, considera lo schema seguente:
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
studio character varying,
title_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,
studio_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,
) PRIMARY KEY(albumid);
CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);
Ora una query può cercare in due campi: Title_Tokens e Studio_Tokens.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'fifth symphony')
AND spanner.search(studio_tokens, 'Blue Note Studio')
Spanner supporta le query di ricerca su più colonne in combinazione con gli operatori di congiunzione, disgiunzione e negazione nella clausola WHERE. Puoi utilizzare tutti i seguenti tipi di query con un indice di ricerca:
Congiunzione: trova i documenti in cui
Titlecontiene il termine "auto" eStudiocontiene il termine "sole".GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')Disgiunzione: trova i documenti in cui
Titlecontiene il termine "auto" oStudiocontiene il termine "sole"GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')Negazione: trova tutti i documenti in cui
Titlenon contiene il termine "auto".GoogleSQL
SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')PostgreSQL
SELECT albumid FROM albums WHERE NOT spanner.search(title_tokens, 'car')Il linguaggio rquery può eseguire lo stesso tipo di ricerche:
GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, '-car')Entrambi i moduli filtrano i documenti in cui
Titleè NULL. Le funzioni di tokenizzazione e di ricerca sono definite in modo da restituire NULL per l'input NULL. SQL definisce NOT NULL come NULL.
Inoltre, puoi fare riferimento più volte alla stessa colonna TOKENLIST.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
PostgreSQL
SELECT albumid
FROM albums
WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))
AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))
Utilizza il linguaggio rquery o SQL per cercare più termini nella stessa colonna. rquery è consigliato per la sua efficiente memorizzazione nella cache delle query con parametri. A parte la migliore percentuale di successo della cache delle query, i linguaggi rquery e SQL hanno gli stessi tassi di latenza e rendimento.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car OR guy')
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')
Puoi anche utilizzare condizioni non di testo accelerate con gli indici di ricerca nella stessa query con le funzioni di ricerca a testo intero.
Passaggi successivi
- Scopri di più sulle query di ricerca full-text.
- Scopri come classificare i risultati di ricerca.
- Scopri come eseguire una ricerca di sottostringa.
- Scopri come impaginare i risultati di ricerca.
- Scopri come combinare query di testo e non di testo.