Indice scalare
Milvus supporta ricerche filtrate che combinano campi scalari e vettoriali. Per migliorare l'efficienza delle ricerche che coinvolgono campi scalari, Milvus ha introdotto l'indicizzazione per campi scalari a partire dalla versione 2.1.0. Questo articolo fornisce una panoramica dell'indicizzazione dei campi scalari in Milvus, aiutandovi a comprenderne il significato e l'implementazione.
Panoramica
Quando si effettuano ricerche di similarità vettoriale in Milvus, è possibile utilizzare gli operatori logici per organizzare i campi scalari in espressioni booleane.
Quando Milvus riceve una richiesta di ricerca con una tale espressione booleana, la analizza in un albero di sintassi astratta (AST) per generare un piano fisico per il filtraggio degli attributi. Milvus applica quindi il piano fisico in ogni segmento per generare un set di bit come risultato del filtraggio e include il risultato come parametro di ricerca vettoriale per restringere l'ambito di ricerca. In questo caso, la velocità delle ricerche vettoriali dipende fortemente dalla velocità del filtraggio degli attributi.
Filtraggio degli attributi in un segmento
L'indicizzazione dei campi scalari è un modo per garantire la velocità del filtraggio degli attributi ordinando i valori dei campi scalari in un modo particolare per accelerare il recupero delle informazioni.
Algoritmi di indicizzazione dei campi scalari
Milvus mira a ottenere un basso utilizzo della memoria, un'elevata efficienza di filtraggio e tempi di caricamento ridotti con i suoi algoritmi di indicizzazione dei campi scalari. Questi algoritmi si dividono in due tipi principali: indicizzazione automatica e indicizzazione inversa.
Indicizzazione automatica
Milvus offre l'opzione AUTOINDEX
per evitare di dover scegliere manualmente il tipo di indice. Quando si chiama il metodo create_index
, se l'opzione index_type
non è specificata, Milvus seleziona automaticamente il tipo di indice più adatto in base al tipo di dati.
La tabella seguente elenca i tipi di dati supportati da Milvus e i corrispondenti algoritmi di indicizzazione automatica.
Tipo di dati | Algoritmo di indicizzazione automatica |
---|---|
VARCHAR | Indice invertito |
INT8 | Indice invertito |
INT16 | Indice invertito |
INT32 | Indice invertito |
INT64 | Indice invertito |
FIORITO | Indice invertito |
DOPPIO | Indice invertito |
Indicizzazione invertita
L'indicizzazione invertita offre un modo flessibile per creare un indice per un campo scalare, specificando manualmente i parametri dell'indice. Questo metodo funziona bene per diversi scenari, tra cui le query a punti, le query a corrispondenza di pattern, le ricerche full-text, le ricerche JSON, le ricerche booleane e persino le query a corrispondenza di prefisso.
Gli indici invertiti implementati in Milvus sono alimentati da Tantivy, una libreria per motori di ricerca full-text. Tantivy garantisce che l'indicizzazione invertita in Milvus sia efficiente e veloce.
Un indice invertito ha due componenti principali: un dizionario dei termini e un elenco invertito. Il dizionario dei termini comprende tutte le parole tokenizzate ordinate alfabeticamente, mentre l'elenco invertito contiene l'elenco dei documenti in cui compare ogni parola. Questa configurazione rende le interrogazioni per punti e per intervalli molto più veloci ed efficienti rispetto alle ricerche brute-force.
Schema dell'indice invertito
I vantaggi dell'uso di un indice invertito sono particolarmente evidenti nelle seguenti operazioni:
- Interrogazione a punti: Ad esempio, quando si cercano documenti contenenti la parola Milvus, il processo inizia controllando se Milvus è presente nel dizionario dei termini. Se non viene trovata, nessun documento contiene la parola. Se invece viene trovata, viene recuperata la lista invertita associata a Milvus, che indica i documenti che contengono la parola. Questo metodo è molto più efficiente di una ricerca a forza bruta in un milione di documenti, poiché il dizionario dei termini ordinato riduce significativamente la complessità temporale della ricerca della parola Milvus.
- Interrogazione di intervallo: Anche l'efficienza delle query di intervallo, come la ricerca di documenti con parole alfabeticamente maggiori di molto, è migliorata dal dizionario dei termini ordinati. Questo approccio è più efficiente rispetto a una ricerca bruta e fornisce risultati più rapidi e accurati.
Risultati del test
Per dimostrare i miglioramenti delle prestazioni forniti dagli indici scalari in Milvus, è stato condotto un esperimento che ha confrontato le prestazioni di diverse espressioni utilizzando l'indicizzazione inversa e la ricerca a forza bruta su dati grezzi.
L'esperimento consisteva nel testare varie espressioni in due condizioni: con un indice invertito e con una ricerca brutale. Per garantire l'equità, è stata mantenuta la stessa distribuzione dei dati nei vari test, utilizzando ogni volta la stessa collezione. Prima di ogni test, la collezione è stata rilasciata e l'indice è stato eliminato e ricostruito. Inoltre, prima di ogni test è stata eseguita una query a caldo per minimizzare l'impatto dei dati freddi e caldi, e ogni query è stata eseguita più volte per garantire la precisione.
Per un set di dati di 1 milione di record, l'uso di un indice invertito può fornire un miglioramento delle prestazioni fino a 30 volte per le query puntuali. I guadagni di prestazioni possono essere ancora più significativi per i dataset più grandi.
Raccomandazioni sulle prestazioni
Per sfruttare appieno le capacità di Milvus nell'indicizzazione di campi scalari e liberare la sua potenza nelle ricerche di similarità vettoriale, potrebbe essere necessario un modello per stimare la dimensione della memoria necessaria in base ai dati in vostro possesso.
Le tabelle seguenti elencano le funzioni di stima per tutti i tipi di dati supportati da Milvus.
Campi numerici
Tipo di dati Funzione di stima della memoria (MB) INT8 numOfRows * 12 / 1024 / 1024 INT16 numOfRows * 12 / 1024 / 1024 INT32 numOfRows * 12 / 1024 / 1024 INT64 numOfRows * 24 / 1024 / 1024 FIAT32 numOfRows * 12 / 1024 / 1024 DOPPIO numOfRows * 24 / 1024 / 1024 Campi stringa
Lunghezza della stringa Funzione di stima della memoria (MB) (0, 8] numOfRows * 128 / 1024 / 1024 (8, 16] numOfRows * 144 / 1024 / 1024 (16, 32] numOfRows * 160 / 1024 / 1024 (32, 64] numOfRows * 192 / 1024 / 1024 (64, 128] numOfRows * 256 / 1024 / 1024 (128, 65535] numOfRows * strLen * 1.5 / 1024 / 1024
Cosa succede dopo
Per indicizzare un campo scalare, leggere Costruire un indice sugli scalari.
Per saperne di più sui termini correlati e sulle regole sopra menzionate, leggete