Como o Bitset permite a versatilidade da pesquisa de similaridade de vectores
Imagem de capa do Bitset
Por Yudong Cai e Angela Ni.
Várias novas caraterísticas essenciais de uma base de dados vetorial são fornecidas juntamente com o lançamento do Milvus 2.0. Entre as novas funcionalidades, a viagem no tempo, a filtragem de atributos e as operações de eliminação estão correlacionadas, uma vez que estas três funcionalidades são obtidas através de um mecanismo comum - o conjunto de bits.
Assim, este artigo tem como objetivo clarificar o conceito de bitset no Milvus e explicar como funciona para suportar operações de eliminação, Time Travel e filtragem de atributos com três exemplos.
O que é um conjunto de bits?
Um conjunto de bits é uma matriz de números de bits ("0" e "1") que pode ser utilizada para representar determinadas informações de dados. Com os conjuntos de bits, é possível armazenar determinados tipos de dados de forma compacta e eficiente, em vez de os armazenar em Ints, floats ou chars. Os conjuntos de bits funcionam com base na lógica booleana, de acordo com a qual o valor de uma saída é válido ou inválido, normalmente indicado por "1" e "0", respetivamente. "1" significa válido e "0" significa inválido. Como os conjuntos de bits são altamente eficientes e podem economizar armazenamento, eles também podem ser usados para obter muitos recursos, como filtragem de atributos, operações de exclusão, viagem no tempo e muito mais.
A partir da versão 0.7.0, o conceito de bitset foi introduzido no Milvus para permitir a função de eliminação. Mais especificamente, o bitset é utilizado para marcar se cada linha do segmento é eliminada. As entidades eliminadas são marcadas com "1" no conjunto de bits correspondente e, como resultado, as entidades eliminadas não serão computadas durante uma pesquisa ou consulta.
Na versão 2.0 do Milvus, a aplicação do conjunto de bits é alargada para permitir mais funcionalidades, como a filtragem de atributos e a viagem no tempo. O princípio geral de um conjunto de bits permanece o mesmo. Ou seja, se uma entidade estiver marcada com "1" no conjunto de bits correspondente, a entidade será ignorada durante uma pesquisa ou consulta. Os conjuntos de bits são utilizados para ativar 3 funcionalidades no Milvus:
- Filtragem de atributos
- Eliminação de dados
- Consulta com viagem no tempo
Como é que o bitset funciona em Milvus?
Os exemplos abaixo são usados para ilustrar como o bitset funciona no Milvus.
Pré-requisitos
Suponha que há um segmento com oito entidades e uma série de eventos de linguagem de manipulação de dados (DML) acontece na ordem mostrada na figura abaixo.
- Quatro das entidades, cujos
primary_keys
são [1, 2, 3, 4] respetivamente, são inseridas quando o timestampts
é igual a 100. - As restantes quatro entidades, cujos
primary_keys
são [5, 6, 7, 8], são inseridas quando o carimbo de data/horats
é igual a 200. - As entidades cujo
primary_keys
é [7, 8] são eliminadas quando o carimbo de data/horats
é igual a 300. - Apenas as entidades, cujos
primary_keys
são [1, 3, 5, 7], satisfazem as condições de filtragem de atributos.
Eventos DML
Caso um
Suponha-se que o valor que um utilizador define para time_travel
é 150. Por outras palavras, o utilizador faz uma consulta dos dados armazenados no Milvus quando ts
= 150. O processo de geração do conjunto de bits é ilustrado na Figura 1.
Durante a fase inicial de filtragem, o resultado do filter_bitset
deveria ser [1, 0, 1, 0, 1, 0, 1, 1, 0], uma vez que as entidades [1, 3, 5, 7] são resultados válidos da filtragem e estão marcadas como "1" no conjunto de bits. No entanto, as entidades [4, 5, 6, 7] nem sequer foram inseridas na base de dados vetorial quando ts
é igual a 150. Por conseguinte, estas quatro entidades devem ser marcadas como "0", independentemente da condição de filtragem. Agora, o resultado do conjunto de bits deve ser [1, 0, 1, 0, 0, 0, 0, 0, 0]. Como em Milvus o princípio geral da computação em bitset é que as entidades marcadas com "1" no bitset são ignoradas durante uma pesquisa ou consulta, o resultado do bitset após a Viagem no Tempo e a filtragem de atributos tem de ser invertido para ser combinado com o mapa de bits de eliminação. O resultado invertido de filter_bitset
deve ser [0, 1, 0, 1, 1, 1, 1, 1, 1, 1].
Quanto ao conjunto de bits de eliminação del_bitset
, o valor inicial deve ser [0, 0, 0, 0, 0, 0, 0, 1, 1]. No entanto, as entidades 7 e 8 não são eliminadas até que ts
seja 300. Portanto, quando ts
é 150, as entidades 7 e 8 ainda são válidas. Como resultado, o valor de del_bitset
após a Viagem no Tempo deve ser [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].
Agora temos dois conjuntos de bits após a Viagem no Tempo e a filtragem de atributos: filter_bitset
[0, 1, 0, 1, 1, 1, 1, 1, 1] e del_bitset
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]. Combine estes dois conjuntos de bits com o operador lógico binário "OR". O valor final de result_bitset
é [0, 1, 0, 1, 1, 1, 1, 1, 1]. Ou seja, apenas as entidades 1 e 3 serão computadas na fase de pesquisa ou consulta seguinte.
Figura 1
Caso dois
Suponha que o valor que o utilizador define para time_travel
é 250. Por outras palavras, o utilizador efectua uma consulta dos dados armazenados no Milvus quando ts
= 250. O processo de geração do conjunto de bits é ilustrado na Figura 2.
Tal como no caso um, o resultado filter_bitset
da fase inicial de filtragem de atributos deve ser [1, 0, 1, 0, 1, 0, 1, 1, 0].
Todas as entidades [1, 2, 3, 4, 5, 6, 7, 8] são inseridas na base de dados vetorial quando ts
= 250. Portanto, o resultado anterior de filter_bitset
permanece o mesmo. Mais uma vez, temos de inverter o resultado de filter_bitset
, e obteremos [0, 1, 0, 1, 0, 1, 0, 1, 0, 1].
Quanto ao conjunto de bits de eliminação del_bitset
, o valor inicial deveria ser [0, 0, 0, 0, 0, 0, 0, 1, 1]. No entanto, as entidades 7 e 8 não foram eliminadas até ts
ser 300. Portanto, quando ts
é 250, as entidades 7 e 8 ainda são válidas. Como resultado, o valor de del_bitset
após a Viagem no Tempo deve ser [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].
Agora temos dois conjuntos de bits após a Viagem no Tempo e a filtragem de atributos: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 0, 1] e del_bitset
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]. Combine estes dois conjuntos de bits com o operador lógico binário "OR". O valor final de result_bitset
é [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]. Ou seja, apenas as entidades [1, 3, 5, 7] serão computadas na fase de pesquisa ou consulta seguinte.
Figura 2
Caso três
Suponha que o valor que o utilizador define para time_travel
é 350. Por outras palavras, o utilizador efectua uma consulta dos dados armazenados no Milvus quando ts
= 350. O processo de geração do conjunto de bits é ilustrado na Figura 3.
Tal como nos casos um e dois, o resultado filter_bitset
da fase inicial de filtragem de atributos é [0, 1, 0, 1, 0, 1, 0, 0, 1].
Todas as entidades [1, 2, 3, 4, 5, 6, 7, 8] são inseridas na base de dados vetorial quando ts
= 350. Por conseguinte, o resultado final invertido do filter_bitset
é [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], o mesmo que no caso dois.
Quanto ao conjunto de bits de eliminação del_bitset
, como as entidades 7 e 8 já foram eliminadas quando ts
=350, o resultado de del_bitset
deve ser [0, 0, 0, 0, 0, 0, 0, 1, 1].
Agora temos dois conjuntos de bits após a Viagem no Tempo e a filtragem de atributos: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] e del_bitset
[0, 0, 0, 0, 0, 0, 0, 1, 1]. Combine estes dois conjuntos de bits com o operador lógico binário "OR". O valor final de result_bitset
é [0, 1, 0, 1, 0, 1, 1, 1, 1]. Ou seja, apenas as entidades [1, 3, 5] serão computadas na fase de pesquisa ou consulta seguinte.
Figura 3
O que é que se segue?
No blogue da série de novas funcionalidades 2.0, pretendemos explicar a conceção das novas funcionalidades. Leia mais nesta série de blogues!
- O que é um conjunto de bits?
- Como é que o bitset funciona em Milvus?
- O que é que se segue?
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word