Accélérer les expressions de correspondance de format

Les index de recherche Spanner peuvent accélérer les expressions de correspondance de modèle telles que LIKE, STARTS_WITH, ENDS_WITH et le prédicat de correspondance d'expression régulière REGEXP_CONTAINS. Cette page explique comment créer et configurer un index de recherche à l'aide de TOKENIZE_NGRAMS pour accélérer les prédicats de correspondance de modèles.

Configurer un n-gramme TOKENLIST pour accélérer la mise en correspondance de motifs

Pour activer l'accélération des expressions de correspondance de modèles, tokenisez une colonne STRING en minuscules avec TOKENIZE_NGRAMS et stockez la colonne STRING à l'aide de la clause STORING dans GoogleSQL ou de la clause INCLUDE dans 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);

Accélération automatique des requêtes avec des prédicats de correspondance de modèle

L'optimiseur de requêtes peut choisir d'accélérer les requêtes suivantes à l'aide de AlbumsIndex avec AlbumTitle_Ngram_Tokens. La requête peut éventuellement fournir @{force_index = AlbumsIndex} pour forcer l'optimiseur à utiliser AlbumsIndex.

GoogleSQL

Dans GoogleSQL, nous accélérons LIKE, STARTS_WITH, ENDS_WITH et REGEXP_CONTAINS.

  • Prédicat LIKE :

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

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

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

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

PostgreSQL

Dans PostgreSQL, nous accélérons LIKE et STARTS_WITH.

  • Prédicat LIKE :

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

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

Conditions préalables à l'accélération

Pour que Spanner puisse activer cette accélération, les règles suivantes doivent être respectées :

  • L'index doit stocker la colonne STRING à l'aide de la clause STORING dans GoogleSQL ou de la clause INCLUDE dans PostgreSQL. Cela évite les jointures ultérieures coûteuses avec la table de base lors du post-filtrage, ce qui est essentiel pour les performances lorsque la recherche récupère trop de documents.
  • La colonne STRING doit être tokenisée à l'aide de TOKENIZE_NGRAMS.
  • La tokenisation doit s'appliquer à LOWER(column_name) plutôt qu'à column_name.
  • Le modèle LIKE, le préfixe STARTS_WITH, le suffixe ENDS_WITH ou l'expression régulière REGEXP_CONTAINS doivent être spécifiés en tant que littéral constant. Les paramètres de requête ne sont pas acceptés pour éviter l'accélération sur des modèles trop courts.
  • Le modèle LIKE, le préfixe STARTS_WITH, le suffixe ENDS_WITH ou l'expression régulière REGEXP_CONTAINS doivent contenir suffisamment de texte pour au moins un n-gramme. Par exemple, r".*" ne répond pas aux critères, car il n'y a aucune séquence de caractères à faire correspondre. De même, si la taille minimale du n-gramme est définie sur 3, le prédicat LIKE "%ab%" ne convient pas, car "ab" (taille 2) est trop court.

Étapes suivantes