🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Come il Bitset consente la versatilità della ricerca di similarità vettoriale

Come il Bitset consente la versatilità della ricerca di similarità vettoriale

  • Engineering
February 14, 2022
Yudong Cai

Bitset Cover Image 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 timestamp ts è 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 timestamp ts è uguale a 200.
  • Le entità il cui primary_keys è [7, 8] sono cancellate quando il timestamp ts è uguale a 300.
  • Solo le entità il cui primary_keys è [1, 3, 5, 7] soddisfano le condizioni di filtraggio degli attributi.

DML events 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.

Figure 1 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.

Figure 2 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.

Figure 3 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 Started

Like the article? Spread the word

Continua a Leggere