Indexar campos de StructArray
Crea índices en los subcampos de StructArray antes de ejecutar una búsqueda vectorial o acelerar el filtrado escalar. Para un campo StructArray, el objetivo del índice es una ruta de subcampo, como chunks[emb_list_vector], chunks[emb] o chunks[section].
Esta página utiliza la colección tech_articles de «Crear un campo StructArray». El campo StructArray chunks contiene subcampos escalares para el filtrado y subcampos vectoriales para la búsqueda.
Antes de empezar
Asegúrate de que el esquema de la colección ya contenga el campo StructArray « chunks » y de que se hayan insertado los datos.
| Ruta del subcampo | Tipo | Finalidad del índice |
|---|---|---|
chunks[emb_list_vector] | FLOAT_VECTOR | Búsqueda en EmbeddingList con métricas de « MAX_SIM* ». |
chunks[emb] | FLOAT_VECTOR | Búsqueda a nivel de elemento con métricas vectoriales habituales. |
chunks[section] | VARCHAR | Filtrado categórico. |
chunks[quality_score] | FLOAT | Filtrado numérico y predicados de tipo rango. |
chunks[has_code] | BOOL | Filtrado booleano. |
Un campo vectorial o un subcampo vectorial solo admite un índice. Si necesitas tanto la búsqueda en EmbeddingList como la búsqueda a nivel de elemento, crea dos subcampos vectoriales independientes e indexa cada uno por separado. En esta página, « chunks[emb_list_vector] » está indexado para la búsqueda en EmbeddingList, y « chunks[emb] » está indexado para la búsqueda a nivel de elemento.
Elegir índices
Utilice el modo de búsqueda para elegir la familia de métricas vectoriales.
| Objetivo de la búsqueda o el filtrado | Ruta de destino | Qué elegir |
|---|---|---|
| Búsqueda en EmbeddingList | chunks[emb_list_vector] | Una familia de métricas « MAX_SIM* ». |
| Búsqueda vectorial a nivel de elemento | chunks[emb] | Una familia de métricas vectoriales habituales, como COSINE, IP o L2. |
| Filtrar por cadena o categoría | chunks[section] | Un índice escalar compatible con tu destino. |
| Filtrar por rango numérico | chunks[quality_score], chunks[page] | Un índice escalar compatible con su destino. |
| Filtrar por valor booleano | chunks[has_code] | Un índice escalar compatible con tu destino. |
La búsqueda en EmbeddingList trata los vectores de un subcampo vectorial de StructArray como una lista de incrustación y devuelve resultados a nivel de entidad. La búsqueda a nivel de elemento busca en cada elemento de Struct de forma independiente y puede devolver el desplazamiento del elemento coincidente.
Crear índices vectoriales
El siguiente ejemplo crea dos índices vectoriales. El primer índice utiliza una métrica « MAX_SIM* » para la búsqueda «EmbeddingList». El segundo índice utiliza una métrica vectorial normal para la búsqueda a nivel de elemento.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
index_params = client.prepare_index_params()
# Index for EmbeddingList search.
index_params.add_index(
field_name="chunks[emb_list_vector]",
index_name="chunks_emb_list_max_sim",
index_type="HNSW",
metric_type="MAX_SIM_COSINE",
params={
"M": 16,
"efConstruction": 200,
},
)
# Index for element-level search.
index_params.add_index(
field_name="chunks[emb]",
index_name="chunks_emb_cosine",
index_type="HNSW",
metric_type="COSINE",
params={
"M": 16,
"efConstruction": 200,
},
)
client.create_index(
collection_name="tech_articles",
index_params=index_params,
)
Advertencia
No crees un índice de « MAX_SIM* » y un índice con métrica vectorial normal en el mismo subcampo vectorial. Si se requieren ambos modos de búsqueda, escribe los vectores en dos subcampos vectoriales distintos y crea un índice en cada subcampo.
Crear índices escalares
Crea índices escalares en los subcampos escalares de StructArray cuando los utilices en filtros. Utiliza la misma sintaxis de ruta « structArray[subfield] ».
index_params = client.prepare_index_params()
index_params.add_index(
field_name="chunks[section]",
index_name="chunks_section_inverted",
index_type="INVERTED",
)
index_params.add_index(
field_name="chunks[has_code]",
index_name="chunks_has_code_inverted",
index_type="INVERTED",
)
index_params.add_index(
field_name="chunks[quality_score]",
index_name="chunks_quality_score_sort",
index_type="STL_SORT",
)
index_params.add_index(
field_name="chunks[page]",
index_name="chunks_page_sort",
index_type="STL_SORT",
)
client.create_index(
collection_name="tech_articles",
index_params=index_params,
)
Los índices escalares son opcionales, pero resultan útiles cuando los subcampos escalares de StructArray aparecen con frecuencia en filtros, como element_filter(chunks, $[quality_score] > 0.9) o MATCH_ANY(chunks, $[section] == "index").
Compatibilidad de métricas de índice
Utilice las siguientes tablas para elegir un tipo de índice y un tipo de métrica para un subcampo vectorial de StructArray. Comience por el destino y, a continuación, elija la familia de métricas según el modo de búsqueda.
Elige un tipo de índice y un tipo de métrica de Milvus a partir de las siguientes tablas de compatibilidad.
Búsqueda en EmbeddingList
La búsqueda en EmbeddingList utiliza métricas de tipo « MAX_SIM* ». Trata los vectores de un subcampo vectorial de StructArray como una lista de incrustaciones y devuelve resultados a nivel de entidad.
| Tipo de datos del subcampo vectorial | Tipo de índice | Tipo de métrica |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | IVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANN | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
BINARY_VECTOR | HNSW | MAX_SIM_HAMMING, MAX_SIM_JACCARD |
Búsqueda a nivel de elemento
La búsqueda a nivel de elemento utiliza métricas vectoriales habituales. Busca cada elemento de Struct de forma independiente y puede devolver el desplazamiento del elemento coincidente.
| Tipo de datos de subcampo vectorial | Tipo de índice | Tipo de métrica |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | FLAT, IVF_FLAT, IVF_FLAT_CC, IVF_SQ8, IVF_SQ_CC, IVF_PQ, SCANN, IVF_RABITQ, IVF_RABITQ_FASTSCAN, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANN | L2, IP, COSINE |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | L2, IP, COSINE |
BINARY_VECTOR | HNSW | HAMMING, JACCARD |
BINARY_VECTOR | BIN_FLAT | HAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD |
BINARY_VECTOR | BIN_IVF_FLAT | HAMMING, JACCARD |
Para obtener información sobre la compatibilidad con versiones específicas y otras restricciones, consulta «Restricciones de StructArray».
Verificar los índices
Tras crear los índices, describe los índices de la colección o la lista para confirmar que las rutas de subcampos esperadas están indexadas.
indexes = client.list_indexes(
collection_name="tech_articles",
)
print(indexes)
También puede describir un índice específico si su versión del SDK expone las API de descripción de índices.
index = client.describe_index(
collection_name="tech_articles",
index_name="chunks_emb_cosine",
)
print(index)
Reglas de indexación
| Regla | Explicación |
|---|---|
| Utilice la sintaxis de ruta para los índices de subcampos. | chunks[emb], no emb ni chunks.emb. |
| Un subcampo vectorial admite un único índice. | Utilice subcampos vectoriales independientes si necesita familias de métricas diferentes. |
Utilice métricas de tipo « MAX_SIM* » para la búsqueda en EmbeddingList. | Los datos de consulta de EmbeddingList requieren un índice creado con una métrica de tipo « MAX_SIM* ». |
| Utiliza métricas vectoriales normales para la búsqueda a nivel de elemento. | La búsqueda a nivel de elemento utiliza datos de consulta vectorial normales y métricas como « COSINE », « IP » o « L2 ». |
| Indexa los subcampos escalares que aparecen en los filtros. | Utiliza los tipos de índice escalar compatibles con tu destino. |
| Ten en cuenta los límites de los campos vectoriales. | El número total de campos vectoriales y subcampos vectoriales está limitado. Consulte «Límites de StructArray» antes de añadir muchos subcampos vectoriales. |
Errores comunes
Crear un índice en «
chunks.emb» en lugar de en «chunks[emb]».Crear únicamente un índice de tipo «
MAX_SIM*» y, a continuación, intentar realizar una búsqueda a nivel de elemento en el mismo subcampo.Crear únicamente un índice vectorial normal y, a continuación, intentar realizar una búsqueda en EmbeddingList en el mismo subcampo.
Reutilizar un subcampo vectorial tanto para métricas de «
MAX_SIM*» como para métricas vectoriales normales.Olvidar los índices escalares para los filtros StructArray más utilizados.
Indexar un subcampo de StructArray que no existe en el esquema de Struct.
Próximos pasos
Para realizar una búsqueda EmbeddingList a nivel de entidad o una búsqueda vectorial a nivel de elemento, consulta «Búsqueda vectorial básica con StructArray».
Para filtrar subcampos escalares de StructArray durante la búsqueda, consulta «Búsqueda filtrada con StructArray».
Para consultar los límites de índices y métricas, consulta «Límites de StructArray».