Come il Bitset consente la versatilità della ricerca di similarità vettoriale
Immagine di copertina di Bitset
Di Yudong Cai e Angela Ni.
Con il rilascio di Milvus 2.0 vengono fornite diverse nuove caratteristiche essenziali di un database vettoriale. Tra le nuove funzionalità, il viaggio nel tempo, il filtraggio degli attributi e le operazioni di cancellazione sono correlate, poiché queste tre caratteristiche sono ottenute con un meccanismo comune: il bitset.
Questo articolo si propone quindi di chiarire il concetto di bitset in Milvus e di spiegare come funziona per supportare le operazioni di cancellazione, il Time Travel e il filtraggio degli attributi con tre esempi.
Che cos'è un bitset?
Un bitset è un array di numeri di bit ("0" e "1") che può essere utilizzato per rappresentare determinate informazioni di dati. Con i bitset è possibile memorizzare alcuni tipi di dati in modo compatto ed efficiente, invece di memorizzarli in Ints, float o caratteri. I bitet funzionano in base alla logica booleana, secondo la quale il valore di un'uscita è valido o non valido, solitamente indicato con "1" e "0" rispettivamente. "1" sta per valido e "0" per non valido. Poiché i bitset sono molto efficienti e consentono di risparmiare spazio di archiviazione, possono essere utilizzati per ottenere molte funzioni, come il filtraggio degli attributi, le operazioni di cancellazione, i viaggi nel tempo e altro ancora.
A partire dalla versione 0.7.0, il concetto di bitset è stato introdotto in Milvus per consentire la funzione di cancellazione. In particolare, il bitset viene utilizzato per indicare se ogni riga del segmento è stata cancellata. Le entità cancellate sono contrassegnate con "1" nel bitset corrispondente e, di conseguenza, le entità cancellate non saranno calcolate durante una ricerca o un'interrogazione.
Nella versione Milvus 2.0, l'applicazione dei bitset è stata estesa per consentire ulteriori funzionalità, come il filtraggio degli attributi e il viaggio nel tempo. Il principio generale di un bitset rimane lo stesso. Cioè, se un'entità è contrassegnata con "1" nel bitset corrispondente, l'entità sarà ignorata durante una ricerca o un'interrogazione. I bitset sono utilizzati per abilitare 3 funzioni in Milvus:
- Filtraggio degli attributi
- Eliminazione dei dati
- Interrogazione con viaggio nel tempo
Come funzionano i bitset in Milvus?
Gli esempi che seguono illustrano il funzionamento dei bitset in Milvus.
Prerequisiti
Supponiamo che ci sia un segmento con otto entità e che una serie di eventi del linguaggio di manipolazione dei dati (DML) avvenga nell'ordine mostrato nella figura seguente.
- Quattro delle entità, il cui
primary_keys
è rispettivamente [1, 2, 3, 4], vengono inserite quando il timestampts
è uguale a 100. Le restanti quattro entità, il cui è uguale a 100, vengono inserite quando il timestamp è uguale a 100. - Le restanti quattro entità, i cui
primary_keys
sono [5, 6, 7, 8], vengono inserite quando il timestampts
è uguale a 200. - Le entità il cui
primary_keys
è [7, 8] sono cancellate quando il timestampts
è uguale a 300. - Solo le entità il cui
primary_keys
è [1, 3, 5, 7] soddisfano le condizioni di filtraggio degli attributi.
Eventi DML
Caso uno
Si supponga che il valore impostato da un utente per time_travel
sia 150. In altre parole, l'utente esegue un'operazione di filtraggio dell'attributo . In altre parole, l'utente esegue una query sui dati memorizzati in Milvus quando ts
= 150. Il processo di generazione del bitset è illustrato in figura. La Figura 1 illustra il processo di generazione del bitset.
Durante la fase iniziale di filtraggio, il risultato di filter_bitset
dovrebbe essere [1, 0, 1, 0, 1, 0, 1, 0] poiché le entità [1, 3, 5, 7] sono risultati validi del filtraggio e sono contrassegnate come "1" nel bitset. Tuttavia, le entità [4, 5, 6, 7] non sono state inserite nel database dei vettori quando ts
è uguale a 150. Pertanto, queste quattro entità dovrebbero essere contrassegnate come "1" nel set di bit. Pertanto, queste quattro entità devono essere contrassegnate come "0", indipendentemente dalla condizione di filtraggio. Ora il risultato del set di bit dovrebbe essere [1, 0, 1, 0, 0, 0, 0, 0]. Poiché in Milvus, il principio generale del calcolo dei bitset è che le entità contrassegnate con "1" nel bitset vengono ignorate durante una ricerca o un'interrogazione, il risultato del bitset dopo il Viaggio nel tempo e il filtraggio degli attributi deve essere capovolto per essere combinato con la bitmap di cancellazione. Il risultato capovolto di filter_bitset
dovrebbe essere [0, 1, 0, 1, 1, 1, 1, 1].
Per quanto riguarda il bitmap di cancellazione del_bitset
, il valore iniziale dovrebbe essere [0, 0, 0, 0, 0, 0, 1, 1]. Tuttavia, le entità 7 e 8 non vengono cancellate finché ts
non è 300. Pertanto, quando è 150, le entità 7 e 8 vengono cancellate. Pertanto, quando ts
è 150, le entità 7 e 8 sono ancora valide. Di conseguenza, il valore di del_bitset
dopo il Viaggio nel tempo dovrebbe essere [0, 0, 0, 0, 0, 0, 0, 0].
Ora abbiamo due set di bit dopo il Viaggio nel tempo e il filtraggio degli attributi: filter_bitset
[0, 1, 0, 1, 1, 1, 1] e del_bitset
[0, 0, 0, 0, 0, 0, 0, 0, 0]. Combinare questi due set di bit con l'operatore logico binario "OR". Il valore finale di result_bitset
è [0, 1, 0, 1, 1, 1, 1, 1]. Ciò significa che solo le entità 1 e 3 saranno calcolate nella successiva fase di ricerca o interrogazione.
Figura 1
Caso due
Supponiamo che il valore impostato dall'utente per time_travel
sia 250. In altre parole, l'utente esegue un'interrogazione sui dati memorizzati in Milvus quando ts
= 250. Il processo di generazione del bitset è illustrato in figura. La Figura 2 illustra il processo di generazione del set di bit.
Come nel primo caso, il risultato filter_bitset
della fase iniziale di filtraggio degli attributi dovrebbe essere [1, 0, 1, 0, 1, 0, 1, 0].
Tutte le entità [1, 2, 3, 4, 5, 6, 7, 8] vengono inserite nel database vettoriale quando ts
= 250. Pertanto, il risultato precedente di filter_bitset
rimane invariato. Anche in questo caso, è necessario capovolgere il risultato di filter_bitset
e si otterrà [0, 1, 0, 1, 0, 1, 0, 1].
Per quanto riguarda l'insieme di bit di cancellazione del_bitset
, il valore iniziale dovrebbe essere [0, 0, 0, 0, 0, 0, 1, 1]. Tuttavia, le entità 7 e 8 non sono state cancellate fino a quando ts
non è 300. Pertanto, quando è 250, le entità 7 e 8 sono state cancellate. Pertanto, quando ts
è 250, le entità 7 e 8 sono ancora valide. Di conseguenza, il valore di del_bitset
dopo il Viaggio nel tempo dovrebbe essere [0, 0, 0, 0, 0, 0, 0, 0].
Ora abbiamo due set di bit dopo il Viaggio nel tempo e il filtraggio degli attributi: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] e del_bitset
[0, 0, 0, 0, 0, 0, 0, 0, 0]. Combinare questi due set di bit con l'operatore logico binario "OR". Il valore finale di result_bitset
è [0, 1, 0, 1, 0, 1, 0, 0, 1]. Ciò significa che solo le entità [1, 3, 5, 7] saranno calcolate nella successiva fase di ricerca o interrogazione.
Figura 2
Caso tre
Si supponga che il valore impostato dall'utente per time_travel
sia 350. In altre parole, l'utente esegue un'interrogazione sui dati memorizzati in Milvus quando ts
= 350. Il processo di generazione del bitset è illustrato nella figura 3. La Figura 3 illustra il processo di generazione del set di bit.
Come nei casi uno e due, il risultato filter_bitset
della fase iniziale di filtraggio degli attributi è [0, 1, 0, 1, 0, 1, 0, 1].
Tutte le entità [1, 2, 3, 4, 5, 6, 7, 8] sono inserite nel database vettoriale quando ts
= 350. Pertanto, il risultato finale capovolto di filter_bitset
è [0, 1, 0, 1, 0, 1, 0, 1], come nel caso due.
Per quanto riguarda il bitet di cancellazione del_bitset
, poiché le entità 7 e 8 sono già state cancellate quando ts
=350, il risultato di del_bitset
dovrebbe essere [0, 0, 0, 0, 0, 0, 1, 1].
Ora abbiamo due set di bit dopo il viaggio nel tempo e il filtraggio degli attributi: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] e del_bitset
[0, 0, 0, 0, 0, 0, 0, 1, 1]. Combinare questi due set di bit con l'operatore logico binario "OR". Il valore finale di result_bitset
è [0, 1, 0, 1, 0, 1, 1, 1]. Ciò significa che solo le entità [1, 3, 5] saranno calcolate nella successiva fase di ricerca o interrogazione.
Figura 3
Cosa succederà in seguito?
Nella serie di blog sulle nuove funzionalità 2.0, ci proponiamo di spiegare il design delle nuove funzionalità. Leggete di più in questa serie di blog!
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word