Los índices de búsqueda de Spanner pueden acelerar las expresiones de coincidencia de patrones, como LIKE, STARTS_WITH, ENDS_WITH y el predicado de coincidencia de expresiones regulares REGEXP_CONTAINS.
En esta página, se describe cómo crear y configurar un índice de búsqueda con TOKENIZE_NGRAMS para acelerar los predicados de coincidencia de patrones.
Configura un n-grama TOKENLIST para la aceleración de la correlación de patrones
Para habilitar la aceleración de expresiones de coincidencia de patrones, tokeniza una columna STRING en minúsculas con TOKENIZE_NGRAMS y almacena la columna STRING con la cláusula STORING en GoogleSQL o la cláusula INCLUDE en 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);
Aceleración automática de consultas con predicados de coincidencia de patrones
El optimizador de consultas podría optar por acelerar las siguientes consultas con AlbumsIndex y AlbumTitle_Ngram_Tokens. De manera opcional, la consulta puede proporcionar @{force_index = AlbumsIndex} para obligar al optimizador a usar AlbumsIndex.
GoogleSQL
En GoogleSQL, aceleramos LIKE, STARTS_WITH, ENDS_WITH y REGEXP_CONTAINS.
Predicado
LIKE:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE AlbumTitle LIKE "%999%";Predicado
STARTS_WITH:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE STARTS_WITH(AlbumTitle, "apple")Predicado
ENDS_WITH:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE ENDS_WITH(AlbumTitle, "apple")Predicado
REGEXP_CONTAINS:SELECT AlbumId FROM Albums @{FORCE_INDEX=AlbumsIndex} WHERE REGEXP_CONTAINS(AlbumTitle, r"(good|great)[ ]+morning")
PostgreSQL
En PostgreSQL, aceleramos LIKE y STARTS_WITH.
Predicado
LIKE:SELECT albumid FROM albums /*@ FORCE_INDEX = albumsidx */ WHERE album_title like '%999%';Predicado
STARTS_WITH:SELECT albumid FROM albums /*@ FORCE_INDEX = albumsidx */ WHERE starts_with(album_title, 'apple')
Requisitos previos sobre la aceleración
Para que Spanner habilite esta aceleración, se deben cumplir las siguientes reglas:
- El índice debe almacenar la columna
STRINGcon la cláusulaSTORINGen GoogleSQL o la cláusulaINCLUDEen PostgreSQL. Esto evita uniones inversas costosas a la tabla base durante el posfiltrado, lo que es fundamental para el rendimiento cuando la búsqueda recupera demasiados documentos. - La columna
STRINGdebe tokenizarse conTOKENIZE_NGRAMS. - La tokenización debe aplicarse a
LOWER(column_name)en lugar decolumn_name. - El patrón
LIKE, el prefijoSTARTS_WITH, el sufijoENDS_WITHo la expresión regularREGEXP_CONTAINSse deben especificar como un literal constante. No se admiten los parámetros de búsqueda para evitar la aceleración en patrones demasiado cortos. - El patrón
LIKE, el prefijoSTARTS_WITH, el sufijoENDS_WITHo la expresión regularREGEXP_CONTAINSdeben contener suficiente texto para, al menos, un n-grama. Por ejemplo,r".*"no cumple con los requisitos porque no hay una secuencia de caracteres que coincida. Del mismo modo, si el tamaño mínimo del n-grama se establece en 3, el predicadoLIKE"%ab%"no cumple con los requisitos porque"ab"(tamaño 2) es demasiado corto.
¿Qué sigue?
- Obtén más información para encontrar coincidencias aproximadas con la búsqueda aproximada.