Hacer una búsqueda de subcadenas

Además de la concordancia de tokens completa, los índices de búsqueda de Spanner admiten búsquedas de subcadenas. En esta página se describe cómo realizar una búsqueda de subcadenas como parte de una búsqueda de texto completo en Spanner.

Las búsquedas de subcadenas tienen las siguientes características:

  • No distingue entre mayúsculas y minúsculas, descarta la mayoría de los signos de puntuación y normaliza los espacios en blanco.
  • No se realiza segmentación en chino, japonés ni coreano, ya que las consultas parciales en estos idiomas suelen segmentarse de forma incorrecta.
  • Si se usan varios términos de búsqueda, el resultado debe contener una subcadena de cada término. Por ejemplo, 'happ momen' coincide con "happy moment" porque ambas subcadenas se encuentran en el texto. No coincide con "happy day".

Ejemplos

Texto almacenado Consulta de subcadena Match
Bridge over Troubled Water ridg roub
Bridge over Troubled Water ridg , roub
Bridge over Troubled Water sobre puente
Bridge over Troubled Water puente ate
Bridge over Troubled Water Bridge bridge bridge
Bridge over Troubled Water bri trou ter
Bridge over Troubled Water bri dge
Bridge over Troubled Water troubledwater No
Bridge over Troubled Water trubled No

Para buscar una subcadena, usa la función TOKENIZE_SUBSTRING en la definición de la columna TOKENLIST, tal como se muestra en el siguiente ejemplo de DDL:

GoogleSQL

CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

PostgreSQL

En este ejemplo se usa spanner.tokenize_substring.

CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
    GENERATED ALWAYS AS (spanner.tokenize_substring(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

En la consulta SQL, usa la función SEARCH_SUBSTRING en la cláusula WHERE. Por ejemplo, la siguiente consulta coincide con un álbum con el título "happy" de la tabla creada en el ejemplo anterior:

GoogleSQL

SELECT Album
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');

PostgreSQL

En este ejemplo se usa spanner.search_substring.

SELECT album
FROM albums
WHERE spanner.search_substring(albumtitle_tokens, 'happ');

TOKENIZE_SUBSTRING genera n-gramos para cada token y los almacena en el índice de búsqueda. La longitud mínima y máxima de los n-gramas que se van a generar se configuran mediante argumentos opcionales.

Los índices de búsqueda de subcadenas pueden usar entre 10 y 30 veces más almacenamiento que los índices de texto completo con los mismos datos, ya que la tokenización genera muchos más tokens. Esto es especialmente cierto si la diferencia entre ngram_size_min y ngram_size_max aumenta. Las consultas de subcadenas también usan más recursos para ejecutarse.

Al igual que TOKENIZE_FULLTEXT, puedes configurar TOKENIZE_SUBSTRING para que use tipos de contenido específicos.

Además de la búsqueda básica de subcadenas, SEARCH_SUBSTRING admite el modo de búsqueda relativa. Una búsqueda relativa refina los resultados de la búsqueda de subcadenas.

Para habilitar el modo de búsqueda relativa, asigna al parámetro relative_search_types de TOKENIZE_SUBSTRING un array no vacío con elementos de tipos de búsqueda relativa admitidos.

Cuando la búsqueda relativa está habilitada en la tokenización, SEARCH_SUBSTRING puede realizar consultas con los siguientes tipos de búsqueda relativa:

  • phrase: coincide con subcadenas contiguas

    Ejemplos

    Texto almacenado Consulta de subcadena. Match
    Bridge over Troubled Water puente sobre
    Bridge over Troubled Water Bridge bridge bridge No
    Bridge over Troubled Water brid over No
    Bridge over Troubled Water cresta sobre problema
    Bridge over Troubled Water Bridge Over Troubled No
    Bridge over Troubled Water idge ove
    Bridge over Troubled Water idge , ove
    Bridge over Troubled Water RIDGE OVE
    Bridge over Troubled Water agua de puente No
  • value_prefix: coincide con subcadenas contiguas y la coincidencia debe empezar al principio del valor. Conceptualmente, es similar a la función STARTS_WITH para cadenas normalizadas en cuanto a las mayúsculas y los espacios en blanco.

    Ejemplos

    Texto almacenado Consulta de subcadena Match
    Bridge over Troubled Water puente sobre
    Bridge over Troubled Water puente , sobre
    Bridge over Troubled Water cresta No
    Bridge over Troubled Water aguas turbulentas No
  • value_suffix: coincide con las subcadenas contiguas y la coincidencia debe producirse al final del valor. Conceptualmente, es similar a la función ENDS_WITH para cadenas normalizadas en cuanto a las mayúsculas y los espacios en blanco.

    Ejemplos

    Texto almacenado Consulta de subcadena. Match
    Bridge over Troubled Water aguas turbulentas
    Bridge over Troubled Water turbia ; agua
    Bridge over Troubled Water agua turbia
    Bridge over Troubled Water aguas turbulentas No
    Bridge over Troubled Water agua turbia No
    Bridge over Troubled Water puente sobre No
  • word_prefix: es como value_prefix, pero la cadena tiene que coincidir con un límite de término (en lugar de un límite de valor).

    Ejemplos

    Texto almacenado Consulta de subcadena Match
    Bridge over Troubled Water superar los problemas
    Bridge over Troubled Water Over , trouble
    Bridge over Troubled Water agua turbia No
    Bridge over Troubled Water sobre el agua No
    Bridge over Troubled Water ove troubled No
    Bridge over Troubled Water ver troubled
  • word_suffix: como value_suffix, pero la cadena debe coincidir al final de un límite de término.

    Ejemplos

    Texto almacenado Consulta de subcadena Match
    Bridge over Troubled Water ver troubled
    Bridge over Troubled Water superar los problemas No
    Bridge over Troubled Water sobre el agua No
    Bridge over Troubled Water ove troubled No

Siguientes pasos