BITMAP
L'indicizzazione bitmap è una tecnica di indicizzazione efficiente progettata per migliorare le prestazioni delle query su campi scalari a bassa cardinalità. La cardinalità si riferisce al numero di valori distinti in un campo. I campi con meno elementi distinti sono considerati a bassa cardinalità.
Questo tipo di indice aiuta a ridurre il tempo di recupero delle query scalari rappresentando i valori del campo in un formato binario compatto ed eseguendo efficienti operazioni bitwise su di essi. Rispetto ad altri tipi di indici, gli indici bitmap hanno in genere una maggiore efficienza di spazio e una maggiore velocità di interrogazione quando si tratta di campi a bassa cardinalità.
Panoramica
Il termine Bitmap combina due parole: Bit e Map. Un bit rappresenta la più piccola unità di dati in un computer, che può contenere solo il valore 0 o 1. Una mappa, in questo contesto, si riferisce a un'unità di dati che non può essere utilizzata. Una mappa, in questo contesto, si riferisce al processo di trasformazione e organizzazione dei dati in base al valore da assegnare a 0 e a 1.
Un indice bitmap è costituito da due componenti principali: le bitmap e le chiavi. Le chiavi rappresentano i valori unici del campo indicizzato. Per ogni valore univoco, esiste una bitmap corrispondente. La lunghezza di queste bitmap è pari al numero di record della collezione. Ogni bit della bitmap corrisponde a un record della collezione. Se il valore del campo indicizzato in un record corrisponde alla chiave, il bit corrispondente viene impostato a 1; altrimenti viene impostato a 0.
Si consideri una raccolta di documenti con i campi Categoria e Pubblico. Vogliamo recuperare i documenti che rientrano nella categoria Tech e sono aperti al pubblico. In questo caso, le chiavi per gli indici bitmap sono Tech e Public.
Indicizzazione bitmap
Come mostrato nella figura, gli indici bitmap per Categoria e Pubblico sono.
Tech: [1, 0, 1, 0, 0], che mostra che solo il primo e il terzo documento rientrano nella categoria Tech.
Pubblico: [1, 0, 0, 1, 0], che indica che solo il 1° e il 4° documento sono aperti al pubblico.
Per trovare i documenti che corrispondono a entrambi i criteri, eseguiamo un'operazione bitwise AND su queste due bitmap.
- Tech AND Public: [1, 0, 0, 0, 0]
La bitmap risultante [1, 0, 0, 0, 0] indica che solo il primo documento(ID 1) soddisfa entrambi i criteri. Utilizzando indici bitmap e operazioni bitwise efficienti, è possibile restringere rapidamente l'ambito di ricerca, eliminando la necessità di scansionare l'intero set di dati.
Creare un indice bitmap
Per creare un indice bitmap in Milvus, utilizzare il metodo create_index()
e impostare il parametro index_type
su "BITMAP"
.
from pymilvus import MilvusClient
index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
index_params.add_index(
field_name="category", # Name of the scalar field to be indexed
index_type="BITMAP", # Type of index to be created
index_name="category_bitmap_index" # Name of the index to be created
)
client.create_index(
collection_name="my_collection", # Specify the collection name
index_params=index_params
)
In questo esempio, creiamo un indice bitmap sul campo category
della raccolta my_collection
. Il metodo add_index()
viene usato per specificare il nome del campo, il tipo di indice e il nome dell'indice.
Una volta creato l'indice bitmap, è possibile utilizzare il parametro filter
nelle operazioni di query per eseguire un filtraggio scalare basato sul campo indicizzato. Ciò consente di restringere in modo efficiente i risultati della ricerca utilizzando l'indice bitmap. Per ulteriori informazioni, consultare Filtraggio dei metadati.
Limiti
Gli indici bitmap sono supportati solo per i campi scalari che non sono chiavi primarie.
Il tipo di dati del campo deve essere uno dei seguenti.
BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
ARRAY
(gli elementi devono essere uno dei seguenti:BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
)
Gli indici bitmap non supportano i seguenti tipi di dati.
FLOAT
,DOUBLE
: I tipi in virgola mobile non sono compatibili con la natura binaria degli indici bitmap.JSON
: I tipi di dati JSON hanno una struttura complessa che non può essere rappresentata in modo efficiente con gli indici bitmap.
Gli indici bitmap non sono adatti a campi con elevata cardinalità (cioè campi con un gran numero di valori distinti).
Come linea guida generale, gli indici bitmap sono più efficaci quando la cardinalità di un campo è inferiore a 500. Quando la cardinalità aumenta oltre questa soglia, gli indici bitmap sono più efficaci.
Quando la cardinalità aumenta oltre questa soglia, i vantaggi in termini di prestazioni degli indici bitmap diminuiscono e l'overhead di memorizzazione diventa significativo.
Per i campi ad alta cardinalità, è opportuno considerare l'uso di tecniche di indicizzazione alternative, come gli indici invertiti, a seconda del caso d'uso specifico e dei requisiti delle query.