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.
Configurar un n-grama TOKENLIST para acelerar la búsqueda de coincidencias 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 puede acelerar las siguientes consultas mediante AlbumsIndex con AlbumTitle_Ngram_Tokens. De forma 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 de la aceleración
Para que Spanner pueda habilitar esta aceleración, se deben cumplir las siguientes reglas:
- El índice debe almacenar la columna
STRINGmediante la cláusulaSTORINGen GoogleSQL o la cláusulaINCLUDEen PostgreSQL. De esta forma, se evitan las uniones inversas costosas a la tabla base durante el postfiltrado, lo que es fundamental para el rendimiento cuando la búsqueda obtiene demasiados documentos. - La columna
STRINGdebe tokenizarse conTOKENIZE_NGRAMS. - La tokenización debe aplicarse a
LOWER(column_name)en lugar de acolumn_name. - El patrón
LIKE, el prefijoSTARTS_WITH, el sufijoENDS_WITHo la expresión regularREGEXP_CONTAINSdeben especificarse como un literal constante. No se admiten parámetros de consulta 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 los requisitos porque no hay ninguna secuencia de caracteres que coincida. Del mismo modo, si el tamaño mínimo del n-grama es 3, el predicadoLIKE"%ab%"no cumple los requisitos porque"ab"(tamaño 2) es demasiado corto.
Siguientes pasos
- Consulta información sobre cómo encontrar coincidencias aproximadas con la búsqueda flexible.