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 subcampoTipoFinalidad del índice
chunks[emb_list_vector]FLOAT_VECTORBúsqueda en EmbeddingList con métricas de « MAX_SIM* ».
chunks[emb]FLOAT_VECTORBúsqueda a nivel de elemento con métricas vectoriales habituales.
chunks[section]VARCHARFiltrado categórico.
chunks[quality_score]FLOATFiltrado numérico y predicados de tipo rango.
chunks[has_code]BOOLFiltrado 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 filtradoRuta de destinoQué elegir
Búsqueda en EmbeddingListchunks[emb_list_vector]Una familia de métricas « MAX_SIM* ».
Búsqueda vectorial a nivel de elementochunks[emb]Una familia de métricas vectoriales habituales, como COSINE, IP o L2.
Filtrar por cadena o categoríachunks[section]Un índice escalar compatible con tu destino.
Filtrar por rango numéricochunks[quality_score], chunks[page]Un índice escalar compatible con su destino.
Filtrar por valor booleanochunks[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.

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 vectorialTipo de índiceTipo de métrica
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTORIVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANNMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2
INT8_VECTORHNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2
BINARY_VECTORHNSWMAX_SIM_HAMMING, MAX_SIM_JACCARD

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 vectorialTipo de índiceTipo de métrica
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTORFLAT, 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, DISKANNL2, IP, COSINE
INT8_VECTORHNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQL2, IP, COSINE
BINARY_VECTORHNSWHAMMING, JACCARD
BINARY_VECTORBIN_FLATHAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD
BINARY_VECTORBIN_IVF_FLATHAMMING, 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

ReglaExplicació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

  1. 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».

  2. Para filtrar subcampos escalares de StructArray durante la búsqueda, consulta «Búsqueda filtrada con StructArray».

  3. Para consultar los límites de índices y métricas, consulta «Límites de StructArray».