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
STRINGutilizzando la clausolaSTORINGin GoogleSQL o la clausolaINCLUDEin 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
STRINGdeve essere tokenizzata utilizzandoTOKENIZE_NGRAMS. - La tokenizzazione deve essere applicata a
LOWER(column_name)anziché acolumn_name. - Il pattern
LIKE, il prefissoSTARTS_WITH, il suffissoENDS_WITHo l'espressione regolareREGEXP_CONTAINSdevono 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 prefissoSTARTS_WITH, il suffissoENDS_WITHo l'espressione regolareREGEXP_CONTAINSdeve 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 predicatoLIKE"%ab%"non è idoneo perché"ab"(dimensione 2) è troppo breve.
Passaggi successivi
- Scopri di più su come trovare corrispondenze approssimative con la ricerca fuzzy.