Accelerare le espressioni di corrispondenza di pattern

Gli indici di ricerca di Spanner possono accelerare le espressioni di corrispondenza dei pattern, ad esempio LIKE, STARTS_WITH, ENDS_WITH e il predicato di corrispondenza delle espressioni regolari REGEXP_CONTAINS. Questa pagina descrive come creare e configurare un indice di ricerca utilizzando TOKENIZE_NGRAMS per accelerare i predicati di corrispondenza dei pattern.

Configurare un n-gramma TOKENLIST per l'accelerazione della corrispondenza dei pattern

Per attivare l'accelerazione delle espressioni di corrispondenza dei pattern, tokenizza una colonna STRING in minuscolo con TOKENIZE_NGRAMS e memorizza la colonna STRING utilizzando la clausola STORING in GoogleSQL o la clausola INCLUDE in PostgreSQL.

GoogleSQL

CREATE TABLE Albums (
AlbumId INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Ngram_Tokens TOKENLIST AS (
  TOKENIZE_NGRAMS(LOWER(AlbumTitle), ngram_size_min=>3, ngram_size_max=>4)) HIDDEN,
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex
ON Albums(AlbumTitle_Ngram_Tokens) STORING (AlbumTitle);

PostgreSQL

CREATE TABLE albums (
albumid bigint NOT NULL,
album_title varchar,
album_title_ngrams_tokens spanner.tokenlist GENERATED ALWAYS AS (
  spanner.tokenize_ngrams(
    lower(album_title),
    ngram_size_min => 3,
    ngram_size_max => 4
  )
) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

CREATE SEARCH INDEX albumsidx ON
albums(album_title_ngrams_tokens) INCLUDE (album_title);

Accelerazione automatica delle query con predicati di corrispondenza dei pattern

Lo strumento di ottimizzazione delle query potrebbe scegliere di accelerare le seguenti query utilizzando AlbumsIndex con AlbumTitle_Ngram_Tokens. (Facoltativo) La query può fornire @{force_index = AlbumsIndex} per forzare l'ottimizzatore a utilizzare AlbumsIndex.

GoogleSQL

In GoogleSQL, acceleriamo LIKE, STARTS_WITH, ENDS_WITH, e REGEXP_CONTAINS.

  • Predicato LIKE:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE AlbumTitle LIKE "%999%";
    
  • Predicato STARTS_WITH:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE STARTS_WITH(AlbumTitle, "apple")
    
  • Predicato ENDS_WITH:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE ENDS_WITH(AlbumTitle, "apple")
    
  • Predicato REGEXP_CONTAINS:

    SELECT AlbumId
    FROM Albums @{FORCE_INDEX=AlbumsIndex}
    WHERE REGEXP_CONTAINS(AlbumTitle, r"(good|great)[ ]+morning")
    

PostgreSQL

In PostgreSQL, acceleriamo LIKE e STARTS_WITH.

  • Predicato LIKE:

    SELECT albumid
    FROM albums /*@ FORCE_INDEX = albumsidx */
    WHERE album_title like '%999%';
    
  • Predicato STARTS_WITH:

    SELECT albumid
    FROM albums /*@ FORCE_INDEX = albumsidx */
    WHERE starts_with(album_title, 'apple')
    

Prerequisiti per l'accelerazione

Affinché Spanner possa abilitare questa accelerazione, devono essere soddisfatte le seguenti regole:

  • L'indice deve archiviare la colonna STRING utilizzando la clausola STORING in GoogleSQL o la clausola INCLUDE in PostgreSQL. In questo modo si evitano costosi back-join alla tabella di base durante il post-filtraggio, il che è fondamentale per le prestazioni quando la ricerca recupera un numero eccessivo di documenti.
  • La colonna STRING deve essere tokenizzata utilizzando TOKENIZE_NGRAMS.
  • La tokenizzazione deve essere applicata a LOWER(column_name) anziché a column_name.
  • Il pattern LIKE, il prefisso STARTS_WITH, il suffisso ENDS_WITH o l'espressione regolare REGEXP_CONTAINS devono essere specificati come valori letterali costanti. I parametri di ricerca non sono supportati per evitare l'accelerazione su pattern troppo brevi.
  • Il pattern LIKE, il prefisso STARTS_WITH, il suffisso ENDS_WITH o l'espressione regolare REGEXP_CONTAINS deve contenere testo sufficiente per almeno un n-gramma. Ad esempio, r".*" non è idoneo perché non esiste una sequenza di caratteri da corrispondere. Allo stesso modo, se la dimensione minima dell'ngramma è impostata su 3, il predicato LIKE "%ab%" non è idoneo perché "ab" (dimensione 2) è troppo breve.

Passaggi successivi