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. Questa pagina descrive come eseguire una ricerca su più colonne, un tipo di ricerca full-text.

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 Title contiene il termine "auto" e Studio 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" o Studio 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 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