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 TOKENLIST de n-gramas para la aceleración de la coincidencia de patrones
Para habilitar la aceleración de expresiones de coincidencia de patrones, tokeniza una columna en minúscula
STRING 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 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 para 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
LIKEpatrón,STARTS_WITHprefijo,ENDS_WITHsufijo oREGEXP_CONTAINSexpresión regular deben especificarse como un literal constante. No se admiten parámetros de consulta para evitar la aceleración en patrones demasiado cortos. - El
LIKEpatrón,STARTS_WITHprefijo,ENDS_WITHsufijo o laREGEXP_CONTAINSexpresión regular deben contener suficiente texto para al menos un n-grama. Por ejemplor".*"no cumple con los requisitos porque no hay una secuencia de caracteres que coincida. Del mismo modo, si el tamaño mínimo de n-grama se establece en 3, elLIKEpredicado"%ab%"no cumple con los requisitos porque"ab"(tamaño 2) es demasiado corto.
¿Qué sigue?
- Obtén información para encontrar coincidencias aproximadas con la búsqueda difusa.