Gli indici di ricerca possono indicizzare più colonne tokenizzate, rendendo più efficienti le query su queste colonne. Questo descrive come eseguire una ricerca su più colonne, un tipo di ricerca a testo intero.
Eseguire una ricerca su 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:
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);
Ora una query può cercare in entrambi i campi:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
Spanner supporta congiuntamente le query di ricerca a più colonne,
gli operatori di disgiunzione e di 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".SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
Disgiunzione: trova i documenti in cui
Title
contiene il termine "auto" oStudio
contiene il termine "sole"SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
Negazione: trova tutti i documenti in cui
Title
non contiene il termine "auto".SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')
Il linguaggio rquery possono eseguire lo stesso tipo di ricerche:
SELECT AlbumId FROM Albums WHERE 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.
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR 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 alla migliore percentuale di successo della cache delle query, i linguaggi rquery e SQL hanno gli stessi tassi di latenza e prestazioni.
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')
Puoi utilizzare le condizioni non di testo accelerate con gli indici di ricerca con le funzioni di ricerca a testo intero.
Passaggi successivi
- Scopri di più sulle query di ricerca a testo intero.
- Scopri come classificare i risultati di ricerca.
- Scopri come eseguire una ricerca di sottostringhe.
- Scopri come suddividere in pagine i risultati di ricerca.
- Scopri come combinare query di testo completo e non di testo.