Pesquisar várias colunas em índices de pesquisa

Os índices de pesquisa podem indexar várias colunas tokenizadas, tornando as consultas nessas colunas mais eficientes. Esta página descreve como realizar uma pesquisa em várias colunas, que é um tipo de pesquisa de texto completo.

A estrutura da pesquisa índice garante que as consultas não precisem de uma mesclagem distribuída, garantindo o desempenho das consultas. A mesclagem distribuída é evitada devido à colocalização de todos os tokens que correspondem a uma linha de tabela base na mesma divisão.

Por exemplo, considere o esquema a seguir:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Studio STRING(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);

Agora, uma consulta pode pesquisar os dois campos:

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
  AND SEARCH(Studio_Tokens, "Blue Note Studio")

O Spanner dá suporte a consultas de pesquisa de várias colunas em conjunto, disjunção e operadores de negação na cláusula WHERE. É possível usar todos os seguintes tipos de consultas com um índice de pesquisa:

  • Conjunção: encontre documentos em que Title tenha o termo "car" e Studio tenha o termo "sun".

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
    
  • Disjunção: encontre documentos em que Title tenha o termo "car" ou Studio tenha o termo "sun".

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
    
  • Negação: encontre todos os documentos em que Title não contenha o termo. "carro".

    SELECT AlbumId
    FROM Albums
    WHERE NOT SEARCH(Title_Tokens, 'car')
    

    A linguagem rquery podem realizar o mesmo tipo de pesquisa:

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, '-car')
    

    Os dois formulários filtram documentos em que Title é NULL. A tokenização e as funções de pesquisa são definidas para retornar NULL na entrada NULL. O SQL define NOT NULL como NULL.

Além disso, é possível referenciar a mesma coluna TOKENLIST várias vezes.

SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
  AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))

Use a linguagem rquery ou o SQL para pesquisar vários termos na mesma coluna. O rquery é recomendado devido ao armazenamento em cache eficiente de consultas para consultas parametrizadas. Além da melhor taxa de acerto do cache de consulta, as linguagens rquery e SQL têm as mesmas taxas de latência e desempenho.

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')

É possível usar condições não textuais aceleradas com índices de pesquisa com funções de pesquisa de texto completo.

A seguir