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 sottocampo | Tipo | Scopo dell’indice |
|---|---|---|
chunks[emb_list_vector] | FLOAT_VECTOR | Ricerca EmbeddingList con metriche " MAX_SIM* ". |
chunks[emb] | FLOAT_VECTOR | Ricerca a livello di elemento con metriche vettoriali standard. |
chunks[section] | VARCHAR | Filtraggio categoriale. |
chunks[quality_score] | FLOAT | Filtraggio numerico e predicati di tipo intervallo. |
chunks[has_code] | BOOL | Filtraggio 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 filtro | Percorso di destinazione | Cosa scegliere |
|---|---|---|
| Ricerca in EmbeddingList | chunks[emb_list_vector] | Una famiglia di metriche " MAX_SIM* ". |
| Ricerca vettoriale a livello di elemento | chunks[emb] | Una famiglia di metriche vettoriali regolari, come COSINE, IP o L2. |
| Filtra per stringa o categoria | chunks[section] | Un indice scalare supportato dalla destinazione. |
| Filtra per intervallo numerico | chunks[quality_score], chunks[page] | Un indice scalare supportato dal target. |
| Filtra per valore booleano | chunks[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à.
Ricerca EmbeddingList
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 vettoriale | Tipo di indice | Tipo di metrica |
|---|---|---|
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 |
Ricerca a livello di elemento
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 vettoriale | Tipo di indice | Tipo di metrica |
|---|---|---|
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 |
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
| Regola | Spiegazione |
|---|---|
| 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.embanziché suchunks[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
Per eseguire una ricerca EmbeddingList a livello di entità o una ricerca vettoriale a livello di elemento, consultare Ricerca vettoriale di base con StructArray.
Per filtrare i sottocampi scalari di StructArray durante la ricerca, consultare Ricerca filtrata con StructArray.
Per esaminare i limiti relativi a indici e metriche, consultare Limiti di StructArray.