milvus-logo
LFAI
Casa
  • Concetti

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.

Attribute filtering in a segment 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 datiAlgoritmo di indicizzazione automatica
VARCHARIndice invertito
INT8Indice invertito
INT16Indice invertito
INT32Indice invertito
INT64Indice invertito
FIORITOIndice invertito
DOPPIOIndice 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.

Inverted index diagram 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 datiFunzione di stima della memoria (MB)
    INT8numOfRows * 12 / 1024 / 1024
    INT16numOfRows * 12 / 1024 / 1024
    INT32numOfRows * 12 / 1024 / 1024
    INT64numOfRows * 24 / 1024 / 1024
    FIAT32numOfRows * 12 / 1024 / 1024
    DOPPIOnumOfRows * 24 / 1024 / 1024
  • Campi stringa

    Lunghezza della stringaFunzione 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

Tradotto daDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Questa pagina è stata utile?