Fazer uma pesquisa de substring

Além da correspondência completa de tokens, os índices de pesquisa do Spanner são compatíveis com pesquisas de substring. Nesta página, descrevemos como realizar uma pesquisa de substring como parte de uma pesquisa de texto completo no Spanner.

As pesquisas de substring têm as seguintes características:

  • Não diferencia maiúsculas de minúsculas, descarta a maioria das pontuações e normaliza espaços em branco.
  • Sem segmentação em chinês, japonês e coreano (CJK), já que consultas parciais em CJK geralmente são segmentadas incorretamente.
  • Para vários termos de pesquisa, o resultado precisa conter uma substring de cada termo. Por exemplo, 'happ momen' corresponde a "happy moment" porque ambas as substrings são encontradas no texto. Ele não corresponde a "happy day".

Exemplos

Texto armazenado Consulta de substring Correspondência
Bridge over Troubled Water ridg roub Sim
Bridge over Troubled Water ridg , roub Sim
Bridge over Troubled Water over brid Sim
Bridge over Troubled Water ponte ate Sim
Bridge over Troubled Water Ponte ponte ponte Sim
Bridge over Troubled Water bri trou ter Sim
Bridge over Troubled Water bri dge Sim
Bridge over Troubled Water troubledwater Não
Bridge over Troubled Water trubled Não

Para uma pesquisa de substring, use a função TOKENIZE_SUBSTRING na definição da coluna TOKENLIST, conforme mostrado no exemplo de DDL a seguir:

GoogleSQL

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

CREATE SEARCH INDEX AlbumsTitleIndex ON Albums(AlbumTitle_Tokens);

PostgreSQL

Este exemplo 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));

CREATE SEARCH INDEX albumstitleindex ON albums(albumtitle_tokens);

Na consulta SQL, use a função SEARCH_SUBSTRING na cláusula WHERE. Por exemplo, a consulta a seguir corresponde a um álbum com o título "happy" da tabela criada no exemplo anterior:

GoogleSQL

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

PostgreSQL

Este exemplo usa spanner.search_substring.

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

O TOKENIZE_SUBSTRING gera n-gramas para cada token e armazena esses n-gramas no índice de pesquisa. O comprimento mínimo e máximo de n-gramas a serem gerados é configurado por argumentos opcionais.

Os índices de pesquisa de substring podem usar de 10 a 30 vezes mais armazenamento do que os índices de texto completo nos mesmos dados, porque a tokenização produz muito mais tokens. Isso é ainda mais verdadeiro à medida que a diferença entre ngram_size_min e ngram_size_max aumenta. As consultas de substring também usam mais recursos para serem executadas.

Assim como TOKENIZE_FULLTEXT, é possível configurar o TOKENIZE_SUBSTRING para usar tipos específicos de conteúdo.

Além da pesquisa básica de substring, SEARCH_SUBSTRING é compatível com o modo de pesquisa relativa. Uma pesquisa relativa refina os resultados da pesquisa de substring.

Para ativar o modo de pesquisa relativa, defina o parâmetro relative_search_types de TOKENIZE_SUBSTRING como uma matriz não vazia com elementos de tipos de pesquisa relativa compatíveis.

Quando a pesquisa relativa está ativada na tokenização, o SEARCH_SUBSTRING pode realizar consultas com os seguintes tipos de pesquisa relativa:

  • phrase: corresponde a substrings contíguas

    Exemplos

    Texto armazenado Consulta de substring. Correspondência
    Bridge over Troubled Water ponte sobre Sim
    Bridge over Troubled Water Ponte ponte ponte Não
    Bridge over Troubled Water ponte Não
    Bridge over Troubled Water crista sobre problemas Sim
    Bridge over Troubled Water ponte sobre águas turbulentas Não
    Bridge over Troubled Water idge ove Sim
    Bridge over Troubled Water idge , ove Sim
    Bridge over Troubled Water RIDGE OVE Sim
    Bridge over Troubled Water água da ponte Não
  • value_prefix: corresponde a substrings contíguas e precisa começar no início do valor. Isso é conceitualmente semelhante à função STARTS_WITH para strings normalizadas de maiúsculas/minúsculas e espaços em branco.

    Exemplos

    Texto armazenado Consulta de substring Correspondência
    Bridge over Troubled Water ponte sobre Sim
    Bridge over Troubled Water ponte , sobre Sim
    Bridge over Troubled Water crista sobre Não
    Bridge over Troubled Water água turva Não
  • value_suffix: corresponde a substrings contíguas e a correspondência precisa ser feita no final do valor. Isso é conceitualmente semelhante à função ENDS_WITH para strings normalizadas de maiúsculas/minúsculas e espaços em branco.

    Exemplos

    Texto armazenado Consulta de substring. Correspondência
    Bridge over Troubled Water água turva Sim
    Bridge over Troubled Water água ; agitada Sim
    Bridge over Troubled Water água turva Sim
    Bridge over Troubled Water águas turbulentas Não
    Bridge over Troubled Water água turva Não
    Bridge over Troubled Water ponte sobre Não
  • word_prefix: como value_prefix, mas a string precisa corresponder a um limite de termo, e não de valor.

    Exemplos

    Texto armazenado Consulta de substring Correspondência
    Bridge over Troubled Water sobre problemas Sim
    Bridge over Troubled Water Mais de , problema Sim
    Bridge over Troubled Water água turva Não
    Bridge over Troubled Water sobre a água Não
    Bridge over Troubled Water ove troubled Não
    Bridge over Troubled Water ver troubled Sim
  • word_suffix: como value_suffix, mas a string precisa corresponder ao final de um limite de termo.

    Exemplos

    Texto armazenado Consulta de substring Correspondência
    Bridge over Troubled Water ver troubled Sim
    Bridge over Troubled Water sobre problemas Não
    Bridge over Troubled Water sobre a água Não
    Bridge over Troubled Water ove troubled Não

A seguir