Panoramica su StructArray
Utilizzare StructArray quando un'entità deve memorizzare un elenco ordinato di elementi strutturati, come ad esempio un documento con molti segmenti, una pagina con molte aree visive o un video con molte clip. StructArray conserva questi elementi all'interno dell'entità principale, consentendo al contempo la ricerca vettoriale e il filtraggio scalare sui campi all'interno di ciascun elemento.
Che cos’è StructArray?
Uno StructArray, noto anche come array di Struct, memorizza un insieme ordinato di elementi Struct in ciascuna entità. Ogni elemento Struct nell’array segue lo stesso schema. Un elemento Struct può contenere sottocampi scalari, sottocampi vettoriali o entrambi.
Ad esempio, una raccolta può memorizzare un articolo come entità e memorizzarne i segmenti in un campo StructArray denominato chunks. Ogni segmento può includere testo, metadati della sezione, punteggi di qualità e una o più rappresentazioni vettoriali.
{
"doc_id": 1,
"title": "Vector search tuning guide",
"category": "search",
"title_vector": [0.10, 0.20, 0.30, 0.40],
"chunks": [
{
"text": "Use HNSW efSearch to trade recall for latency.",
"section": "index",
"page": 1,
"quality_score": 0.92,
"has_code": true,
"emb_list_vector": [0.11, 0.21, 0.31, 0.41],
"emb": [0.12, 0.20, 0.33, 0.39]
},
{
"text": "Range search returns vectors within a distance boundary.",
"section": "search",
"page": 2,
"quality_score": 0.86,
"has_code": false,
"emb_list_vector": [0.18, 0.23, 0.29, 0.36],
"emb": [0.19, 0.24, 0.30, 0.37]
}
]
}
I due sottocampi vettoriali in questo esempio rappresentano lo stesso blocco da due prospettive di ricerca. ` chunks[emb_list_vector] ` è destinato alla ricerca EmbeddingList con metriche ` MAX_SIM* `, mentre ` chunks[emb] ` è destinato alla ricerca a livello di elemento con metriche vettoriali standard quali ` COSINE`, ` IP` o ` L2`.
Quando utilizzare StructArray
Utilizzare StructArray quando l’unità naturale che si desidera restituire è più grande dell’unità naturale che si desidera cercare o filtrare.
| Caso d'uso | Perché StructArray è utile | Campo StructArray tipico |
|---|---|---|
| Recupero di documenti | Memorizza un documento come entità mentre si effettua la ricerca nei suoi blocchi. | chunks |
| Recupero con interazione ritardata | Memorizza un documento o una pagina come elenco di embedding e assegnagli un punteggio con MAX_SIM*. | chunks[emb_list_vector] oppure patches[emb] |
| Recupero a livello di elemento | Restituisci il frammento, il clip, la patch o l’osservazione più rilevante, compreso il relativo offset nell’array. | chunks[emb] |
| Filtraggio strutturato | Filtra in base ai sottocampi scalari all'interno degli elementi Struct, quali sezione, punteggio, pagina o flag. | chunks[section], chunks[quality_score] |
| Riduzione dei risultati duplicati a livello di entità padre | Mantiene gli elementi figli sotto la stessa entità padre invece di memorizzare ciascun figlio come riga separata. | chunks, clips, patches |
Matrice decisionale
Utilizzare la seguente matrice per scegliere il percorso StructArray corretto.
| Obiettivo | Percorso consigliato | Granularità del risultato | Inizia da qui |
|---|---|---|---|
| Modellare un oggetto padre con molti figli strutturati. | Crea un campo StructArray. | L'entità contiene elementi Struct ordinati. | Creare un campo StructArray |
| Inserisci record padre con dati figlio annidati. | Inserire entità il cui campo StructArray è un elenco di oggetti Struct. | Inserimento a livello di entità. | Inserimento di dati nei campi StructArray |
| Eseguire ColBERT, ColPali o il recupero a interazione tardiva a livello di documento. | Utilizzare la ricerca EmbeddingList con un indice MAX_SIM*. | A livello di entità. | Ricerca con Embedding List |
| Cerca singoli chunk, clip o patch. | Utilizza la ricerca a livello di elemento con una metrica vettoriale regolare. | Livello di elemento Struct, con offset quando disponibile. | Ricerca vettoriale di base con StructArray |
| Limita la ricerca vettoriale a livello di elemento agli elementi che soddisfano condizioni scalari. | Utilizza ` element_filter`. | Filtraggio a livello di elemento; la forma del risultato dipende dal tipo di ricerca. | Ricerca filtrata con StructArray |
| Selezionare le entità in base al numero di elementi Struct che soddisfano una condizione. | Utilizzare MATCH_ANY, MATCH_ALL, MATCH_LEAST, MATCH_MOST o MATCH_EXACT. | Livello entità. | Operatori StructArray |
| Utilizzare i limiti di punteggio o di distanza sui sottocampi vettoriali di StructArray. | Utilizzare la ricerca per intervallo a livello di elemento. | Livello degli elementi di Struct. | Ricerca per intervallo con StructArray |
| Restituisce al massimo un risultato per entità padre dopo la ricerca a livello di elemento. | Utilizzare la ricerca raggruppata per chiave primaria. | Livello entità dopo il raggruppamento. | Ricerca raggruppata con StructArray |
| Combina la ricerca sugli elementi di StructArray con un altro campo vettoriale. | Utilizzare la ricerca ibrida con un AnnSearchRequest mirato a un sottocampo vettoriale di StructArray. | Ricerca secondaria a livello di elemento, riordino dei risultati a livello di entità. | Ricerca ibrida con StructArray |
Comprendere i due modelli di ricerca
Ricerca EmbeddingList |
Ricerca a livello di elemento |
|---|---|
|
La ricerca EmbeddingList considera i vettori all'interno di un sottocampo vettoriale di StructArray come un unico elenco di embedding per l'entità padre. Anche la query è un elenco di embedding. Milvus confronta l'elenco di embedding della query con quello memorizzato utilizzando una metrica di
|
La ricerca a livello di elemento tratta ogni elemento Struct come un candidato indipendente per la ricerca vettoriale. Ogni risultato positivo rappresenta un elemento corrispondente all’interno del campo StructArray, e i risultati non raggruppati possono rivelare l’offset dell’elemento.
|
Avviso
Se la tua raccolta richiede sia la ricerca EmbeddingList che quella a livello di elemento, utilizza due sottocampi vettoriali separati. Un campo vettoriale o un sottocampo vettoriale accetta un solo indice e le due modalità di ricerca richiedono famiglie di metriche diverse.
Mappa della documentazione
La documentazione di StructArray è suddivisa in pagine dedicate alla modellazione e pagine dedicate alla ricerca. Utilizza le pagine di modellazione per definire e preparare i dati. Utilizza le pagine di ricerca per scegliere il comportamento di recupero e filtraggio più adatto.
| Area | Pagina | Utilizzala per |
|---|---|---|
| Modellazione | Creare un campo StructArray | Definire lo schema Struct e aggiungere un campo StructArray. |
| Modellazione | Inserimento dei dati nei campi StructArray | Preparare e inserire dati StructArray annidati. |
| Modellazione | Indice dei campi StructArray | Creare indici vettoriali e scalari sui sottocampi di StructArray. |
| Riferimento | Limiti di StructArray | Verifica i limiti relativi a schema, tipo di dati, indice, ricerca, filtro e versione. |
| Ricerca | Ricerca vettoriale di base con StructArray | Confronta la ricerca EmbeddingList con la ricerca vettoriale a livello di elemento. |
| Ricerca | Ricerca per intervallo con StructArray | Utilizza i vincoli di intervallo con i sottocampi vettoriali di StructArray. |
| Ricerca | Ricerca raggruppata con StructArray | Raggruppa i risultati della ricerca a livello di elemento in base alla chiave primaria. |
| Ricerca | Ricerca ibrida con StructArray | Combina la ricerca a livello di elemento con StructArray con altre ricerche vettoriali. |
| Ricerca | Ricerca filtrata con StructArray | Utilizza i filtri di StructArray nella ricerca, nella query e nella ricerca ibrida. |
| Ricerca | Ricerca con elenchi di embedding | Crea sistemi di recupero in stile ColBERT e ColPali con StructArray. |
| Filtro | Operatori StructArray | Sintassi di riferimento per gli operatori element_filter e MATCH_*. |
Limiti chiave da verificare per primi
Struct può essere utilizzato come tipo di elemento di un campo Array. Non viene utilizzato come campo di raccolta di primo livello.
Tutti gli elementi Struct presenti nello stesso campo StructArray condividono uno schema predefinito.
I sottocampi vettoriali richiedono indici. La ricerca EmbeddingList utilizza le metriche di
MAX_SIM*, mentre la ricerca a livello di elemento utilizza le normali metriche vettoriali.element_filtereMATCH_*sono destinati ai sottocampi scalari all’interno dei campi StructArray. Utilizzare$[subfield]solo all’interno di questi operatori.Alcune combinazioni di ricerca sono limitate alla versione o specifiche della modalità. Verificare i limiti di StructArray prima di fare affidamento sulla ricerca per intervallo, sulla ricerca per raggruppamento, sulla ricerca ibrida, sui campi nullabili o sui campi aggiunti dinamicamente.
Passi successivi
Per progettare uno schema, leggere Creare un campo StructArray.
Per preparare i dati, leggere Inserimento di dati nei campi StructArray.
Per scegliere gli indici, leggere " Indice dei campi StructArray".
Per effettuare ricerche nei sottocampi vettoriali di StructArray, iniziare con Ricerca vettoriale di base con StructArray.
Per filtrare i sottocampi scalari di StructArray, consultare Operatori StructArray e Ricerca filtrata con StructArray.