Gli indici di ricerca possono indicizzare più colonne tokenizzate, rendendo più efficienti le query su queste colonne. Questa pagina descrive come eseguire una ricerca in più colonne, ovvero un tipo di ricerca a testo intero.
Eseguire una ricerca in più colonne
La struttura dell'indice di ricerca garantisce che le query non richiedano un join distribuito, assicurando un rendimento prevedibile delle query. L'unione distribuita viene evitata grazie alla colocalizzazione di tutti i token corrispondenti 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 con più colonne negli operatori di congiunzione, disgiunzione e negazione nella clausola WHERE
. Con un indice di ricerca puoi utilizzare tutti i seguenti tipi di query:
Congiunzione: trova i documenti in cui
Title
contiene il termine "auto" eStudio
contiene 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
Title
contiene il termine "auto" oStudio
contiene 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
Title
non 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 per restituire NULL per input NULL. SQL definisce NOT NULL come NULL.
Inoltre, puoi fare riferimento alla stessa colonna TOKENLIST
più volte.
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 l'efficiente caching delle query per le query con parametri. Oltre a una migliore percentuale di hit della cache delle query, i linguaggi R e SQL hanno le stesse latenze e gli stessi tassi di prestazioni.
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 a testo intero.
- Scopri come determinare il ranking dei risultati di ricerca.
- Scopri come eseguire una ricerca di sottostringhe.
- Scopri come paginare i risultati di ricerca.
- Scopri come combinare query a testo intero e non di testo.