Os índices de pesquisa podem indexar várias colunas com tokens, o que torna as consultas nestas colunas mais eficientes. Esta página descreve como fazer uma pesquisa em várias colunas, que é um tipo de pesquisa de texto integral.
Faça uma pesquisa em várias colunas
A estrutura do índice de pesquisa garante que as consultas não precisam de uma junção distribuída, o que garante um desempenho previsível das consultas. A junção distribuída é evitada devido à colocação conjunta de todos os tokens que correspondem a uma linha da tabela base na mesma divisão.
Por exemplo, considere o seguinte esquema:
GoogleSQL
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);
PostgreSQL
CREATE TABLE albums (
  albumid character varying NOT NULL,
  title character varying,
  studio character varying,
  title_tokens spanner.tokenlist
      GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,
  studio_tokens spanner.tokenlist
      GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,
) PRIMARY KEY(albumid);
CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);
Agora, uma consulta pode pesquisar dois campos: Title_Tokens e Studio_Tokens.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
  AND SEARCH(Studio_Tokens, "Blue Note Studio")
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'fifth symphony')
  AND spanner.search(studio_tokens, 'Blue Note Studio')
O Spanner suporta consultas de pesquisa de várias colunas em conjunto com operadores de disjunção e negação na cláusula WHERE. Pode usar todos os seguintes tipos de consultas com um índice de pesquisa:
- Conjunção: encontre documentos onde - Titletem o termo "carro" e- Studiotem o termo "sol".- GoogleSQL- SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')- PostgreSQL- SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')
- Disjunção: encontre documentos em que - Titletem o termo "carro" ou- Studiotem o termo "sol"- GoogleSQL- SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')- PostgreSQL- SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')
- Negação: encontre todos os documentos onde - Titlenão contém o termo "carro".- GoogleSQL- SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')- PostgreSQL- SELECT albumid FROM albums WHERE NOT spanner.search(title_tokens, 'car')- O idioma rquery pode realizar o mesmo tipo de pesquisas: - GoogleSQL- SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')- PostgreSQL- SELECT albumid FROM albums WHERE spanner.search(title_tokens, '-car')- Ambas as formas filtram documentos em que - Titleé NULL. As funções de tokenização e de pesquisa são definidas para devolver NULL na entrada NULL. O SQL define NOT NULL como NULL.
Além disso, pode fazer referência à mesma coluna TOKENLIST várias vezes.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
  AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
PostgreSQL
SELECT albumid
FROM albums
WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))
  AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))
Use a linguagem rquery ou SQL para pesquisar vários termos na mesma coluna. A linguagem rquery é recomendada devido à respetiva colocação em cache de consultas eficiente para consultas parametrizadas. Além da melhor taxa de acertos da cache de consultas, os idiomas rquery e SQL têm as mesmas taxas de latência e desempenho.
GoogleSQL
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')
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car OR guy')
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')
Também pode usar condições não textuais aceleradas com índices de pesquisa na mesma consulta com funções de pesquisa de texto completo.
O que se segue?
- Saiba mais sobre as consultas de pesquisa de texto integral.
- Saiba como classificar os resultados da pesquisa.
- Saiba como fazer uma pesquisa de substring.
- Saiba como paginar os resultados da pesquisa.
- Saiba como misturar consultas de texto completo e sem texto.