Esta página explica como criar e gerir índices de vetores do Spanner, que usam a pesquisa de vizinhos mais próximos aproximados (ANN) e estruturas baseadas em árvores para acelerar as pesquisas de semelhança de vetores nos seus dados.
O Spanner acelera as pesquisas de vetores de vizinhos mais próximos aproximados (ANN) através de um índice de vetores especializado. Este índice tira partido do Scalable Nearest Neighbor (ScaNN) da Google Research, um algoritmo de vizinho mais próximo altamente eficiente.
O índice vetorial usa uma estrutura baseada em árvore para dividir os dados e facilitar as pesquisas mais rápidas. O Spanner oferece configurações de árvore de dois e três níveis:
- Configuração de árvore de dois níveis: os nós folha (
num_leaves
) contêm grupos de vetores estreitamente relacionados juntamente com o respetivo centroide correspondente. O nível raiz consiste nos centroides de todos os nós folha. - Configuração de árvore de três níveis: semelhante em conceito a uma árvore de dois níveis, mas
introduzindo uma camada de ramificação adicional (
num_branches
), a partir da qual os centroides dos nós folha são ainda mais divididos para formar o nível raiz (num_leaves
).
O Spanner escolhe um índice por si. No entanto, se souber que um índice específico funciona melhor, pode usar a sugestão FORCE_INDEX
para escolher usar o índice de vetores mais adequado para o seu exemplo de utilização.
Para mais informações, consulte as declarações VECTOR INDEX
.
Limitações
- Não pode dividir previamente os índices vetoriais. Para mais informações, consulte a Vista geral da pré-divisão.
Crie um índice vetorial
Para otimizar a capacidade de memorização e o desempenho de um índice vetorial, recomendamos que:
Crie o índice de vetores depois de a maioria das linhas com incorporações ser escrita na base de dados. Também pode ter de recriar periodicamente o índice vetorial depois de inserir novos dados. Para mais informações, consulte o artigo Recrie o índice vetorial.
Use a cláusula
STORING
para armazenar uma cópia de uma coluna no índice de vetores. Se um valor de coluna for armazenado no índice vetorial, o Spanner realiza a filtragem ao nível da folha do índice para melhorar o desempenho das consultas. Recomendamos que armazene uma coluna se for usada numa condição de filtragem. Para mais informações sobre a utilização deSTORING
num índice, consulte o artigo Crie um índice para análises apenas de índice.
Quando cria a tabela, a coluna de incorporação tem de ser uma matriz do tipo de dados FLOAT32
(recomendado) ou FLOAT64
e ter uma anotação vector_length, que indica a dimensão dos vetores. O comprimento do vetor ideal depende da sua carga de trabalho, do tamanho do conjunto de dados e dos recursos computacionais disponíveis. Experimente diferentes dimensões para encontrar o tamanho mais pequeno que
mantém a precisão e o desempenho da sua aplicação.
A declaração DDL seguinte cria uma tabela Documents
com uma coluna de incorporação DocEmbedding
com um comprimento do vetor:
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING (1024),
DocContents Bytes(MAX),
DocEmbedding ARRAY<FLOAT32>(vector_length=>128) NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>(vector_length=>128),
WordCount INT64,
) PRIMARY KEY (DocId);
Depois de preencher a tabela Documents
, pode criar um índice vetorial com uma árvore de dois níveis e 1000 nós folha na tabela Documents
com uma coluna de incorporação DocEmbedding
usando a distância do cosseno:
CREATE VECTOR INDEX DocEmbeddingIndex
ON Documents(DocEmbedding)
STORING (WordCount)
OPTIONS (distance_type = 'COSINE', tree_depth = 2, num_leaves = 1000);
Se a coluna de incorporação não estiver marcada como NOT NULL
na definição da tabela, tem de a declarar com uma cláusula WHERE COLUMN_NAME IS NOT NULL
na definição do índice vetorial, em que COLUMN_NAME
é o nome da coluna de incorporação. Para criar um índice vetorial com uma árvore de três níveis e 1 000 000 de nós folha na coluna de incorporação anulável NullableDocEmbedding
usando a distância do cosseno:
CREATE VECTOR INDEX DocEmbeddingThreeLevelIndex
ON Documents(NullableDocEmbedding)
STORING (WordCount)
WHERE NullableDocEmbedding IS NOT NULL
OPTIONS (distance_type = 'COSINE', tree_depth = 3, num_branches=1000, num_leaves = 1000000);
Filtre um índice vetorial
Também pode criar um índice vetorial filtrado para encontrar os itens mais semelhantes na sua base de dados que correspondem à condição do filtro. Um índice vetorial filtrado indexa seletivamente as linhas que cumprem as condições de filtro especificadas, melhorando o desempenho da pesquisa.
No exemplo seguinte, a tabela Documents2
tem uma coluna denominada Category
.
Na nossa pesquisa vetorial, queremos indexar a categoria "Tecnologia", por isso, criamos uma coluna gerada que é avaliada como NULL
se a condição de categoria não for cumprida.
CREATE TABLE Documents2 (
DocId INT64 NOT NULL,
Category STRING(MAX),
NullIfFiltered BOOL AS (IF(Category = 'Tech', TRUE, NULL)) HIDDEN,
DocEmbedding ARRAY<FLOAT32>(vector_length=>128),
) PRIMARY KEY (DocId);
Em seguida, criamos um índice vetorial com um filtro. O índice de vetores TechDocEmbeddingIndex
indexa apenas documentos na categoria "Tecnologia".
CREATE VECTOR INDEX TechDocEmbeddingIndex
ON Documents2(DocEmbedding)
STORING(NullIfFiltered)
WHERE DocEmbedding IS NOT NULL AND NullIfFiltered IS NOT NULL
OPTIONS (...);
Quando o Spanner executa a seguinte consulta, que tem filtros que correspondem ao TechDocEmbeddingIndex
, seleciona automaticamente e é acelerado pelo TechDocEmbeddingIndex
. A consulta só pesquisa documentos na categoria "Tech" (Tecnologia). Também pode usar {@FORCE_INDEX=TechDocEmbeddingIndex}
para forçar o Spanner a usar TechDocEmbeddingIndex
explicitamente.
SELECT *
FROM Documents2
WHERE DocEmbedding IS NOT NULL AND NullIfFiltered IS NOT NULL
ORDER BY APPROX_(....)
LIMIT 10;
O que se segue?
Saiba mais acerca dos vizinhos mais próximos aproximados do Spanner.
Saiba mais sobre as funções GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
eAPPROXIMATE_DOT_PRODUCT()
.Saiba mais acerca das declarações GoogleSQL
VECTOR INDEX
.Saiba mais acerca das práticas recomendadas para o índice vetorial.