Indexar campos do StructArray

Crie índices nos subcampos do StructArray antes de executar uma pesquisa vetorial ou acelerar a filtragem escalar. Para um campo StructArray, o alvo do índice é um caminho de subcampo, como chunks[emb_list_vector], chunks[emb] ou chunks[section].

Esta página utiliza a coleção tech_articles da secção «Criar um campo StructArray». O campo StructArray chunks contém subcampos escalares para filtragem e subcampos vetoriais para pesquisa.

Antes de começar

Certifique-se de que o esquema da coleção já contém o campo StructArray « chunks » e que os dados foram inseridos.

Caminho do subcampoTipoFinalidade do índice
chunks[emb_list_vector]FLOAT_VECTORPesquisa na EmbeddingList com métricas de « MAX_SIM* ».
chunks[emb]FLOAT_VECTORPesquisa ao nível do elemento com métricas vetoriais normais.
chunks[section]VARCHARFiltragem categórica.
chunks[quality_score]FLOATFiltragem numérica e predicados do tipo intervalo.
chunks[has_code]BOOLFiltragem booleana.

Um campo vetorial ou subcampo vetorial aceita apenas um índice. Se precisar tanto da pesquisa EmbeddingList como da pesquisa ao nível do elemento, crie dois subcampos vetoriais separados e indexe-os separadamente. Nesta página, « chunks[emb_list_vector] » está indexado para a pesquisa EmbeddingList e « chunks[emb] » está indexado para a pesquisa ao nível do elemento.

Escolher índices

Utilize o modo de pesquisa para escolher a família de métricas vetoriais.

Objetivo da pesquisa ou do filtroCaminho de destinoO que escolher
Pesquisa na EmbeddingListchunks[emb_list_vector]Uma família de métricas « MAX_SIM* ».
Pesquisa vetorial ao nível do elementochunks[emb]Uma família de métricas vetoriais regulares, como « COSINE », « IP » ou « L2 ».
Filtrar por cadeia de caracteres ou categoriachunks[section]Um índice escalar suportado pelo seu destino.
Filtrar por intervalo numéricochunks[quality_score], chunks[page]Um índice escalar suportado pelo seu destino.
Filtrar por valor booleanochunks[has_code]Um índice escalar suportado pelo seu destino.

A pesquisa EmbeddingList trata os vetores num subcampo vetorial de StructArray como uma lista de incorporação e devolve resultados ao nível da entidade. A pesquisa ao nível do elemento pesquisa cada elemento de Struct de forma independente e pode devolver o deslocamento do elemento correspondente.

Criar índices vetoriais

O exemplo seguinte cria dois índices vetoriais. O primeiro índice utiliza uma métrica « MAX_SIM* » para a pesquisa «EmbeddingList». O segundo índice utiliza uma métrica vetorial normal para a pesquisa ao nível do 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,
)

Aviso Não crie um índice « MAX_SIM* » e um índice com métrica vetorial normal no mesmo subcampo vetorial. Se forem necessários ambos os modos de pesquisa, grave os vetores em dois subcampos vetoriais separados e crie um índice para cada subcampo.

Criar índices escalares

Crie índices escalares nos subcampos escalares do StructArray quando os utilizar em filtros. Utilize a mesma sintaxe de caminho « 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,
)

Os índices escalares são opcionais, mas úteis quando os subcampos escalares do StructArray aparecem frequentemente em filtros, tais como « element_filter(chunks, $[quality_score] > 0.9) » ou « MATCH_ANY(chunks, $[section] == "index") ».

Compatibilidade de métricas de índice

Utilize as tabelas seguintes para escolher um tipo de índice e um tipo de métrica para um subcampo vetorial do StructArray. Comece pelo destino e, em seguida, escolha a família de métricas por modo de pesquisa.

Escolha um tipo de índice e um tipo de métrica do Milvus a partir das seguintes tabelas de compatibilidade.

A pesquisa EmbeddingList utiliza métricas do tipo « MAX_SIM* ». Trata os vetores num subcampo de tipo «StructArray» como uma lista de incorporação e devolve resultados ao nível da entidade.

Tipo de dados do subcampo vetorialTipo 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

A pesquisa ao nível do elemento utiliza métricas vetoriais normais. Pesquisa cada elemento da Struct de forma independente e pode devolver o deslocamento do elemento correspondente.

Tipo de dados do subcampo do vetorTipo 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 obter assistência específica para cada versão e conhecer outros limites, consulte Limites do StructArray.

Verificar índices

Após criar os índices, descreva os índices da coleção ou da lista para confirmar se os caminhos dos subcampos esperados estão indexados.

indexes = client.list_indexes(
    collection_name="tech_articles",
)

print(indexes)

Também pode descrever um índice específico se a sua versão do SDK disponibilizar APIs de descrição de índices.

index = client.describe_index(
    collection_name="tech_articles",
    index_name="chunks_emb_cosine",
)

print(index)

Regras de indexação

RegraExplicação
Utilize a sintaxe de caminho para índices de subcampos.chunks[emb] e o índice como « », e não como « emb » ou « chunks.emb ».
Um subcampo vetorial aceita um único índice.Utilize subcampos vetoriais separados se necessitar de famílias de métricas diferentes.
Utilize métricas do tipo « MAX_SIM* » para a pesquisa no EmbeddingList.Os dados de consulta da EmbeddingList requerem um índice criado com uma métrica do tipo « MAX_SIM* ».
Utilize métricas vetoriais normais para a pesquisa ao nível do elemento.A pesquisa ao nível do elemento utiliza dados de consulta vetoriais regulares e métricas como « COSINE », « IP » ou « L2 ».
Indexe os subcampos escalares que aparecem nos filtros.Utilize tipos de índice escalar suportados pelo seu destino.
Tenha em conta os limites dos campos vetoriais.O número total de campos vetoriais e subcampos vetoriais é limitado. Consulte «Limites do StructArray» antes de adicionar muitos subcampos vetoriais.

Erros comuns

  • Criar um índice em « chunks.emb » em vez de « chunks[emb] ».

  • Criar apenas um índice « MAX_SIM* » e, em seguida, tentar executar uma pesquisa ao nível do elemento no mesmo subcampo.

  • Criar apenas um índice vetorial normal e, em seguida, tentar executar uma pesquisa EmbeddingList no mesmo subcampo.

  • Reutilizar um subcampo vetorial tanto para métricas « MAX_SIM* » como para métricas vetoriais normais.

  • Esquecer os índices escalares para filtros StructArray muito utilizados.

  • Indexar um subcampo StructArray que não existe no esquema Struct.

Próximos passos

  1. Para executar uma pesquisa EmbeddingList ao nível da entidade ou uma pesquisa vetorial ao nível do elemento, consulte Pesquisa vetorial básica com StructArray.

  2. Para filtrar subcampos escalares do StructArray durante a pesquisa, leia «Pesquisa filtrada com StructArray».

  3. Para consultar os limites de índices e métricas, leia «Limites do StructArray».