Os índices de pesquisa do Spanner podem acelerar expressões de correspondência de padrões, como
LIKE,
STARTS_WITH,
ENDS_WITH,
e o predicado de correspondência de expressão regular
REGEXP_CONTAINS.
Nesta página, descrevemos como criar e configurar um índice de pesquisa usando
TOKENIZE_NGRAMS
para acelerar os predicados de correspondência de padrões.
Configurar uma TOKENLIST de n-gramas para aceleração de correspondência de padrões
Para ativar a aceleração de expressões de correspondência de padrões, use um tokenizador em uma coluna em letras minúsculas
STRING com
TOKENIZE_NGRAMS
e armazene a coluna STRING usando a cláusula STORING no
GoogleSQL ou a cláusula INCLUDE no 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);
Aceleração automática de consultas com predicados de correspondência de padrões
O otimizador de consultas pode optar por acelerar as consultas a seguir usando AlbumsIndex com AlbumTitle_Ngram_Tokens. Opcionalmente, a consulta pode fornecer
@{force_index = AlbumsIndex} para forçar o otimizador a usar AlbumsIndex.
GoogleSQL
No GoogleSQL, aceleramos LIKE,
STARTS_WITH,
ENDS_WITH,
e
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
No PostgreSQL, aceleramos
LIKE e
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')
Pré-requisitos para aceleração
Para que o Spanner ative essa aceleração, as regras a seguir precisam ser atendidas:
- O índice precisa armazenar a coluna
STRINGusando a cláusulaSTORINGno GoogleSQL ou a cláusulaINCLUDEno PostgreSQL. Isso evita junções de volta caras à tabela de base durante a pós-filtragem, o que é fundamental para o desempenho quando a pesquisa recupera documentos em excesso. - A coluna
STRINGprecisa ser tokenizada usandoTOKENIZE_NGRAMS. - A tokenização precisa ser aplicada a
LOWER(column_name)em vez decolumn_name. - O
LIKEpadrão,STARTS_WITHprefixo,ENDS_WITHsufixo ouREGEXP_CONTAINSexpressão regular precisam ser especificados como um literal constante. Os parâmetros de consulta não são aceitos para evitar a aceleração em padrões muito curtos. - O
LIKEpadrão,STARTS_WITHprefixo,ENDS_WITHsufixo ouREGEXP_CONTAINSexpressão regular precisam conter texto suficiente para pelo menos um n-grama. Por exemplor".*"não se qualifica porque não há sequência de caracteres a serem correspondidos. Da mesma forma, se o tamanho mínimo do n-grama estiver definido como 3, oLIKEpredicado"%ab%"não se qualificará porque"ab"(tamanho 2) é muito curto.