Acelerar las expresiones de coincidencia de patrones

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 STRING mediante la cláusula STORING en GoogleSQL o la cláusula INCLUDE en 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 STRING debe tokenizarse con TOKENIZE_NGRAMS.
  • La tokenización debe aplicarse a LOWER(column_name) en lugar de a column_name.
  • El patrón LIKE, el prefijo STARTS_WITH, el sufijo ENDS_WITH o la expresión regular REGEXP_CONTAINS deben 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 prefijo STARTS_WITH, el sufijo ENDS_WITH o la expresión regular REGEXP_CONTAINS deben 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 predicado LIKE "%ab%" no cumple los requisitos porque "ab" (tamaño 2) es demasiado corto.

Siguientes pasos