Cercare in più colonne negli indici di ricerca

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.

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" e Studio 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" o Studio 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