Campi dell'StructArray indicizzati

Creare indici sui sottocampi di StructArray prima di eseguire una ricerca vettoriale o di accelerare il filtraggio scalare. Per un campo StructArray, la destinazione dell'indice è un percorso di sottocampo, ad esempio chunks[emb_list_vector], chunks[emb] o chunks[section].

Questa pagina utilizza la raccolta tech_articles descritta in Creazione di un campo StructArray. Il campo StructArray chunks contiene sottocampi scalari per il filtraggio e sottocampi vettoriali per la ricerca.

Prima di iniziare

Assicurarsi che lo schema della raccolta contenga già il campo StructArray " chunks " e che i dati siano stati inseriti.

Percorso del sottocampoTipoScopo dell’indice
chunks[emb_list_vector]FLOAT_VECTORRicerca EmbeddingList con metriche " MAX_SIM* ".
chunks[emb]FLOAT_VECTORRicerca a livello di elemento con metriche vettoriali standard.
chunks[section]VARCHARFiltraggio categoriale.
chunks[quality_score]FLOATFiltraggio numerico e predicati di tipo intervallo.
chunks[has_code]BOOLFiltraggio booleano.

Un campo vettoriale o un sottocampo vettoriale accetta un solo indice. Se sono necessarie sia la ricerca EmbeddingList che quella a livello di elemento, creare due sottocampi vettoriali distinti e indicizzarli separatamente. In questa pagina, chunks[emb_list_vector] è indicizzato per la ricerca EmbeddingList, mentre chunks[emb] è indicizzato per la ricerca a livello di elemento.

Scegliere gli indici

Utilizza la modalità di ricerca per scegliere la famiglia di metriche vettoriali.

Obiettivo della ricerca o del filtroPercorso di destinazioneCosa scegliere
Ricerca in EmbeddingListchunks[emb_list_vector]Una famiglia di metriche " MAX_SIM* ".
Ricerca vettoriale a livello di elementochunks[emb]Una famiglia di metriche vettoriali regolari, come COSINE, IP o L2.
Filtra per stringa o categoriachunks[section]Un indice scalare supportato dalla destinazione.
Filtra per intervallo numericochunks[quality_score], chunks[page]Un indice scalare supportato dal target.
Filtra per valore booleanochunks[has_code]Un indice scalare supportato dal target.

La ricerca EmbeddingList tratta i vettori presenti in un sottocampo vettoriale di StructArray come una lista di embedding e restituisce risultati a livello di entità. La ricerca a livello di elemento esamina ogni elemento di Struct in modo indipendente e può restituire l'offset dell'elemento corrispondente.

Creazione di indici vettoriali

L'esempio seguente crea due indici vettoriali. Il primo indice utilizza una metrica " MAX_SIM* " per la ricerca EmbeddingList. Il secondo indice utilizza una metrica vettoriale standard per la ricerca a livello di 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,
)

Avviso Non creare un indice " MAX_SIM* " e un indice con metrica vettoriale standard sullo stesso sottocampo vettoriale. Se sono necessarie entrambe le modalità di ricerca, scrivere i vettori in due sottocampi vettoriali separati e creare un indice su ciascun sottocampo.

Creare indici scalari

Creare indici scalari sui sottocampi scalari di StructArray quando li si utilizza nei filtri. Utilizzare la stessa sintassi del percorso 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,
)

Gli indici scalari sono facoltativi ma utili quando i sottocampi scalari di StructArray compaiono frequentemente nei filtri, come element_filter(chunks, $[quality_score] > 0.9) o MATCH_ANY(chunks, $[section] == "index").

Compatibilità delle metriche degli indici

Utilizzare le tabelle seguenti per scegliere un tipo di indice e un tipo di metrica per un sottocampo vettoriale di StructArray. Partire dall’obiettivo, quindi scegliere la famiglia di metriche in base alla modalità di ricerca.

Scegliere un tipo di indice Milvus e un tipo di metrica dalle seguenti tabelle di compatibilità.

La ricerca EmbeddingList utilizza le metriche MAX_SIM*. Considera i vettori presenti in un sottocampo vettoriale StructArray come un elenco di embedding e restituisce risultati a livello di entità.

Tipo di dati del sottocampo vettorialeTipo di indiceTipo di metrica
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 ricerca a livello di elemento utilizza metriche vettoriali standard. Esegue la ricerca su ciascun elemento della struttura in modo indipendente e può restituire l'offset dell'elemento corrispondente.

Tipo di dati del sottocampo vettorialeTipo di indiceTipo di metrica
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

Per il supporto specifico per versione e altre limitazioni, vedere Limiti di StructArray.

Verifica degli indici

Dopo aver creato gli indici, descrivere gli indici della collezione o dell’elenco per confermare che i percorsi dei sottocampi previsti siano indicizzati.

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

print(indexes)

È inoltre possibile descrivere un indice specifico se la versione dell’SDK espone le API di descrizione degli indici.

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

print(index)

Regole degli indici

RegolaSpiegazione
Utilizzare la sintassi del percorso per gli indici dei sottocampi.chunks[emb], non emb o chunks.emb.
Un sottocampo vettoriale accetta un solo indice.Utilizzare sottocampi vettoriali separati se sono necessarie famiglie di metriche diverse.
Utilizzare le metriche MAX_SIM* per la ricerca in EmbeddingList.I dati di query EmbeddingList richiedono un indice creato con una metrica MAX_SIM*.
Utilizzare metriche vettoriali standard per la ricerca a livello di elemento.La ricerca a livello di elemento utilizza dati di query vettoriali standard e metriche quali COSINE, IP o L2.
Indice i sottocampi scalari che compaiono nei filtri.Utilizzare i tipi di indice scalare supportati dalla destinazione.
Tenere presenti i limiti dei campi vettoriali.Il numero totale di campi vettoriali e sottocampi vettoriali è limitato. Consultare Limiti di StructArray prima di aggiungere molti sottocampi vettoriali.

Errori comuni

  • Creare un indice su chunks.emb anziché su chunks[emb].

  • Creare solo un indice MAX_SIM* e poi tentare di eseguire una ricerca a livello di elemento sullo stesso sottocampo.

  • Creare solo un indice vettoriale regolare e poi tentare di eseguire una ricerca EmbeddingList sullo stesso sottocampo.

  • Riutilizzare un sottocampo vettoriale sia per le metriche " MAX_SIM* " che per quelle vettoriali regolari.

  • Dimenticare gli indici scalari per i filtri StructArray utilizzati intensamente.

  • Indicizzazione di un sottocampo StructArray che non esiste nello schema Struct.

Prossimi passi

  1. Per eseguire una ricerca EmbeddingList a livello di entità o una ricerca vettoriale a livello di elemento, consultare Ricerca vettoriale di base con StructArray.

  2. Per filtrare i sottocampi scalari di StructArray durante la ricerca, consultare Ricerca filtrata con StructArray.

  3. Per esaminare i limiti relativi a indici e metriche, consultare Limiti di StructArray.