En esta página, se explica cómo crear y administrar índices de vectores de Spanner, que usan la búsqueda de vecinos más cercanos aproximados (ANN) y estructuras basadas en árboles para acelerar las búsquedas de similitud de vectores en tus datos.
Spanner acelera las búsquedas de vectores de vecino más cercano aproximado (ANN) con un índice de vectores especializado. Este índice aprovecha el vecino más cercano escalable (ScaNN) de Google Research, un algoritmo de vecino más cercano altamente eficiente.
El índice de vectores usa una estructura basada en un árbol para particionar los datos y facilitar búsquedas más rápidas. Spanner ofrece configuraciones de árbol de dos y tres niveles:
- Configuración de árbol de dos niveles: Los nodos hoja (
num_leaves
) contienen grupos de vectores estrechamente relacionados junto con su centroide correspondiente. El nivel raíz consta de los centroides de todos los nodos hoja. - Configuración de árbol de tres niveles: Es similar en concepto a un árbol de dos niveles, pero introduce una capa de rama adicional (
num_branches
), desde la cual los centroides de los nodos hoja se particionan aún más para formar el nivel raíz (num_leaves
).
Spanner elige un índice por ti. Sin embargo, si sabes que un índice específico funciona mejor, puedes usar la sugerencia FORCE_INDEX
para elegir el índice de vectores más adecuado para tu caso de uso.
Para obtener más información, consulta las declaraciones VECTOR INDEX
.
Limitaciones
- No puedes dividir previamente los índices vectoriales. Para obtener más información, consulta la Descripción general de la división previa.
Crea un índice vectorial
Para optimizar la recuperación y el rendimiento de un índice de vectores, te recomendamos que hagas lo siguiente:
Crea tu índice de vectores después de que se escriban en tu base de datos la mayoría de las filas con incorporaciones. También es posible que debas volver a compilar el índice de vectores periódicamente después de insertar datos nuevos. Para obtener más información, consulta Cómo volver a compilar el índice vectorial.
Usa la cláusula
STORING
para almacenar una copia de una columna en el índice de vectores. Si un valor de columna se almacena en el índice de vectores, Spanner realiza el filtrado en el nivel de hoja del índice para mejorar el rendimiento de las consultas. Te recomendamos que almacenes una columna si se usa en una condición de filtrado. Para obtener más información sobre el uso deSTORING
en un índice, consulta Crea un índice para búsquedas solo de índice.
Cuando crees tu tabla, la columna de incorporación debe ser un array del tipo de datos FLOAT32
(recomendado) o FLOAT64
, y tener una anotación vector_length que indique la dimensión de los vectores.
La siguiente instrucción DDL crea una tabla Documents
con una columna de incorporación DocEmbedding
con una longitud de vector:
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);
Después de propagar tu tabla Documents
, puedes crear un índice vectorial con un árbol de dos niveles y 1,000 nodos hoja en la tabla Documents
con una columna de incorporación DocEmbedding
usando la distancia del coseno:
CREATE VECTOR INDEX DocEmbeddingIndex
ON Documents(DocEmbedding)
STORING (WordCount)
OPTIONS (distance_type = 'COSINE', tree_depth = 2, num_leaves = 1000);
Si tu columna de incorporación no está marcada como NOT NULL
en la definición de la tabla, debes declararla con una cláusula WHERE COLUMN_NAME IS NOT NULL
en la definición del índice de vectores, donde COLUMN_NAME
es el nombre de tu columna de incorporación. Para crear un índice vectorial con un árbol de tres niveles y 1,000,000 de nodos hoja en la columna de incorporación anulable NullableDocEmbedding
con la distancia del coseno, haz lo siguiente:
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);
Filtra un índice vectorial
También puedes crear un índice de vectores filtrado para encontrar los elementos más similares en tu base de datos que coincidan con la condición del filtro. Un índice de vectores filtrado indexa de forma selectiva las filas que satisfacen las condiciones de filtro especificadas, lo que mejora el rendimiento de la búsqueda.
En el siguiente ejemplo, la tabla Documents2
tiene una columna llamada Category
.
En nuestra búsqueda de vectores, queremos indexar la categoría "Tecnología", por lo que creamos una columna generada que se evalúa como NULL
si no se cumple la condición de categoría.
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);
Luego, creamos un índice de vectores con un filtro. El índice de vectores TechDocEmbeddingIndex
solo indexa documentos de la categoría "Tecnología".
CREATE VECTOR INDEX TechDocEmbeddingIndex
ON Documents2(DocEmbedding)
STORING(NullIfFiltered)
WHERE DocEmbedding IS NOT NULL AND NullIfFiltered IS NOT NULL
OPTIONS (...);
Cuando Spanner ejecuta la siguiente consulta, que tiene filtros que coinciden con TechDocEmbeddingIndex
, selecciona automáticamente TechDocEmbeddingIndex
y se acelera con él. La búsqueda solo se realiza en documentos de la categoría "Tecnología". También puedes usar {@FORCE_INDEX=TechDocEmbeddingIndex}
para forzar a Spanner a usar TechDocEmbeddingIndex
de forma explícita.
SELECT *
FROM Documents2
WHERE DocEmbedding IS NOT NULL AND NullIfFiltered IS NOT NULL
ORDER BY APPROX_(....)
LIMIT 10;
¿Qué sigue?
Obtén más información sobre los vecinos más cercanos aproximados de Spanner.
Obtén más información sobre las funciones
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
yAPPROXIMATE_DOT_PRODUCT()
de GoogleSQL.Obtén más información sobre las sentencias
VECTOR INDEX
de GoogleSQL.Obtén más información sobre las prácticas recomendadas para los índices vectoriales.