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 clauseSTORINGdans GoogleSQL ou de la clauseINCLUDEdans 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
STRINGdoit être tokenisée à l'aide deTOKENIZE_NGRAMS. - La tokenisation doit s'appliquer à
LOWER(column_name)plutôt qu'àcolumn_name. - Le modèle
LIKE, le préfixeSTARTS_WITH, le suffixeENDS_WITHou l'expression régulièreREGEXP_CONTAINSdoivent ê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éfixeSTARTS_WITH, le suffixeENDS_WITHou l'expression régulièreREGEXP_CONTAINSdoivent 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édicatLIKE"%ab%"ne convient pas, car"ab"(taille 2) est trop court.
Étapes suivantes
- Découvrez comment trouver des correspondances approximatives avec la recherche floue.