En este documento se explica cómo usar las inserciones almacenadas para generar índices y consultar inserciones. Para obtener más información sobre cómo almacenar inserciones, consulta Almacenar inserciones de vectores.
Puedes crear índices ScaNN, IVF, IVFFlat y HNSW con AlloyDB.
Antes de empezar
Antes de empezar a crear índices, debes completar los siguientes requisitos previos.
- Los vectores de inserción se añaden a una tabla de tu base de datos de AlloyDB. 
- La versión - vectoro posterior de la extensión- 0.5.0basada en- pgvector, ampliada por Google para AlloyDB, está instalada.- CREATE EXTENSION IF NOT EXISTS vector;
- Para generar índices - ScaNN, instala la extensión- alloydb_scannademás de la extensión- vector.- CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Crear un índice
Puede crear uno de los siguientes tipos de índices para las tablas de su base de datos.
Crear un índice de ScaNN
AlloyDB alloydb_scann, a
Extensión de PostgreSQL desarrollada por Google que implementa un
índice de vecinos más cercanos eficiente basado en [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
El índice ScaNN es un índice de cuantificación basado en árboles para
búsqueda de vecinos más cercanos. Proporciona un tiempo de creación de índices más corto y un
uso de memoria en comparación con HNSW. Además, ofrece un CPS más rápido en
comparación con HNSW en función de la carga de trabajo.
una tabla de tu base de datos de AlloyDB. Si intentas generar un índice ScaNN
en una tabla vacía o con particiones, es posible que tengas algunos problemas. Para obtener más información
Para obtener información sobre los errores generados, consulta Solucionar errores de índice de ScaNN.
Índice de árbol de dos niveles ScaNN
Para aplicar un índice de árbol de dos niveles con el algoritmo ScaNN a una columna
que contenga las inserciones de vectores almacenadas, ejecuta la siguiente consulta DDL:
CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE);
Haz los cambios siguientes:
- INDEX_NAME: el nombre del índice que quieras- Crear (por ejemplo, - my-scann-index). Los nombres de los índices se comparten- en toda tu base de datos. Asegúrate de que cada nombre de índice sea único para cada - de tu base de datos. 
- TABLE: la tabla a la que se va a añadir el índice.
- EMBEDDING_COLUMN: columna que almacena- vector- datos. 
- DISTANCE_FUNCTION: la función de distancia que se va a usar- con este índice. Elige una de estas opciones: - Distancia L2: - l2
- Producto escalar: - dot_product
- Distancia del coseno: - cosine
 
- NUM_LEAVES_VALUE: número de particiones que se van a aplicar- este índice. Puede ser cualquier valor entre 1 y 1048576. Más información - Para saber cómo decidir este valor, consulta Ajustar un índice de - ScaNN.
Índice de árbol de tres niveles ScaNN
Para crear un índice de árbol de tres niveles usando el algoritmo ScaNN en una columna
que contenga las inserciones de vectores almacenadas, ejecuta la siguiente consulta DDL:
CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Haz los cambios siguientes:
- MAX_NUM_LEVELS: número máximo de niveles de la- Árbol de clústeres de k-medias. El valor predeterminado - 1es para la estructura de árbol de dos niveles.- cuantización y - 2para la cuantización basada en árboles de tres niveles.
Una vez que hayas creado el índice, podrás ejecutar consultas de búsqueda de vecinos más cercanos que
Aprovecha el índice siguiendo las instrucciones de [Crear un índice de vecinos más cercanos
consulta con el texto proporcionado](#query).
Los parámetros de índice deben configurarse de forma que se consiga un equilibrio entre las consultas por segundo y
Retirada. Para obtener más información sobre cómo optimizar el índice ScaNN, consulta [Optimizar un índice ScaNN
index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).
Para crear este índice en una columna de inserciones que use el tipo de datos real[]
En lugar de vector, convierte la columna al tipo de datos vector:
CREATE INDEX INDEX_NAME ON TABLE
  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Sustituye DIMENSIONS por la anchura dimensional del
columna de inserción. Para obtener más información sobre cómo encontrar las dimensiones,
Consulta la función vector_dims en [Vector
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
Para ver el progreso de la indexación, usa la vista pg_stat_progress_create_index:
SELECT * FROM pg_stat_progress_create_index;
La columna phase muestra el estado actual de la creación del índice y la
La fase building index: tree training desaparece una vez que se ha creado el índice.
Para ajustar el índice de forma que se equilibren la precisión y las consultas por segundo, consulta Ajustar un índice ScaNN.
Analizar una tabla indexada
Después de crear el índice ScaNN, ejecuta el comando ANALYZE para actualizar las estadísticas de tus datos.
ANALYZE TABLE;
Ejecutar una consulta
Una vez que haya almacenado e indexado las inserciones en su base de datos, podrá empezar a
consultar mediante la consulta [pgvector
functionality](https://github.com/pgvector/pgvector#querying). No puedes ejecutar
consultas de búsqueda masivas mediante la extensión alloydb_scann.
Para encontrar los vecinos semánticos más cercanos de un vector de inserción, puedes ejecutar la
en la siguiente consulta de ejemplo, donde se define la misma función de distancia que se ha usado
durante la creación del índice.
  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT
Haz los cambios siguientes:
- TABLE: la tabla que contiene la inserción que se va a comparar con la- texto. 
- INDEX_NAME: el nombre del índice que quieras usar. Por ejemplo,- Por ejemplo, - my-scann-index.
- EMBEDDING_COLUMN: la columna que contiene el- inserciones. 
- DISTANCE_FUNCTION_QUERY: la función de distancia que se va a usar con este- consulta. Elige una de las siguientes opciones en función de la función de distancia utilizada: - Al crear el índice: - Distancia L2: - <->
- Producto interior: - <#>
- Distancia del coseno: - <=>
 
- EMBEDDING: el vector de inserción del que quieres encontrar el vector almacenado más cercano.- vecinos semánticos de. 
- ROW_COUNT: número de filas que se van a devolver.- Especifica - 1si solo quieres la mejor coincidencia.
Para obtener más información sobre otros ejemplos de consultas, consulta
También puedes usar la función embedding() para traducir el
texto en un vector. Aplicas el vector a uno de los
pgvector operador de vecino más cercano, <-> para la distancia L2, para encontrar las filas de la base de datos con el
las incrustaciones más similares semánticamente.
Como embedding() devuelve una matriz real, debes convertir explícitamente el
embedding() llama a vector para usar estos valores con pgvector
operadores.
  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;
  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT
Haz los cambios siguientes:
- MODEL_ID: ID del modelo que se va a consultar.- Si usas Vertex AI Model Garden, especifica - text-embedding-005como ID de modelo. Estos son los modelos basados en la nube que AlloyDB puede usar para las incrustaciones de texto. Para obtener más información, consulta Inserciones de texto.
- Opcional: - VERSION_TAG: la etiqueta de versión del modelo que se va a consultar. Añade el prefijo- @a la etiqueta.- Si usas uno de los modelos en inglés de - text-embeddingcon Vertex AI, especifica una de las etiquetas de versión (por ejemplo,- text-embedding-005) que se indican en Versiones del modelo.- Google recomienda que siempre especifiques la etiqueta de versión. Si no especifica la etiqueta de versión, AlloyDB siempre usará la versión más reciente del modelo, lo que podría dar lugar a resultados inesperados. 
- TEXT: el texto que se va a traducir a una incrustación de vector.
Siguientes pasos
- Ejemplo de flujo de trabajo de una incrustación
- Ajustar el rendimiento de las consultas vectoriales
- Métricas de índice vectorial