milvus-logo
LFAI
홈페이지
  • 개념

비트셋

이 주제에서는 Milvus에서 속성 필터링 및 삭제 작업과 같은 주요 기능을 활성화하는 데 도움이 되는 비트셋 메커니즘을 소개합니다.

개요

비트셋은 비트의 집합입니다. 비트는 일반적으로 01 또는 부울 값 truefalse 과 같이 두 가지 값만 가능한 요소입니다. Milvus에서 비트셋은 비트 번호 01 의 배열로, 특정 데이터를 정수, 부동 소수점 또는 문자 대신 간결하고 효율적으로 표현하는 데 사용할 수 있습니다. 비트 번호는 기본적으로 0 이며, 특정 요구 사항을 충족하는 경우에만 1 으로 설정됩니다.

비트셋에 대한 연산은 출력 값이 유효하거나 유효하지 않은 부울 논리로 수행되며, 각각 10 으로도 표시됩니다. 예를 들어 논리 연산자 AND 를 사용하여 동일한 인덱스 위치에 있는 항목을 기준으로 두 비트셋을 비교하고 그 결과로 새 비트셋을 생성할 수 있습니다. 한 위치의 두 항목이 같으면 새 비트셋에 1, 다르면 0 이 해당 위치에 기록됩니다.

구현

비트셋은 Milvus가 시간 여행을 통해 속성 필터링, 데이터 삭제 및 쿼리를 수행하는 데 도움이 되는 간단하면서도 강력한 메커니즘입니다.

속성 필터링

비트셋은 두 가지 가능한 값만 포함하므로 속성 필터링의 결과를 저장하는 데 적합합니다. 주어진 속성 필터의 요구 사항을 충족하는 데이터는 1 로 표시됩니다.

데이터 삭제

비트셋은 세그먼트의 행이 삭제되었는지 여부에 대한 정보를 간결하게 저장하는 역할을 합니다. 삭제된 엔티티는 해당 비트셋에 1 로 표시되며, 검색 또는 쿼리 중에 계산되지 않습니다.

예제

여기에서는 위에서 설명한 비트셋의 세 가지 주요 구현을 모두 참조하여 Milvus에서 비트셋이 어떻게 사용되는지 보여주는 세 가지 예를 제시합니다. 세 가지 경우 모두 8개의 엔티티가 있는 세그먼트가 있고, 그 다음 일련의 데이터 조작 언어(DML) 이벤트가 아래 표시된 순서대로 발생합니다.

  • primary_keys가 각각 [1, 2, 3, 4]인 4개의 엔티티는 타임스탬프 ts 가 100과 같을 때 삽입됩니다.
  • primary_keys가 [5, 6, 7, 8]인 나머지 4개 엔티티는 타임스탬프 ts 가 200일 때 삽입됩니다.
  • primary_keys가 [7, 8]인 엔티티는 타임스탬프 ts 가 300일 때 삭제됩니다.
  • primary_keys가 [1, 3, 5, 7]인 엔티티만 속성 필터링 조건을 충족합니다.

Order of DML events DML 이벤트 순서

사례 1

이 경우 사용자가 time_travel 를 150 으로 설정하면 사용자가 ts = 150 을 만족하는 데이터에 대한 쿼리를 수행한다는 의미입니다. 비트셋 생성 프로세스는 그림 1에 설명되어 있습니다.

초기 필터링 단계에서 filter_bitset[1, 0, 1, 0, 1, 0, 1, 0] 이며, 엔티티 [1, 3, 5, 7]은 유효한 필터링 결과이므로 1 로 표시됩니다.

그러나 엔티티 [4, 5, 6, 7]은 ts 이 150 일 때 벡터 데이터베이스에 삽입되지 않았습니다. 따라서 이 네 개의 엔티티는 필터링 조건에 관계없이 0으로 표시되어야 합니다. 이제 비트셋 결과는 [1, 0, 1, 0, 0, 0, 0, 0] 이 되어야 합니다.

데이터 삭제에서 설명한 대로 1 로 표시된 엔티티는 검색 또는 쿼리 중에 무시됩니다. 이제 삭제 비트맵과 결합하기 위해 비트셋 결과를 뒤집어야 하며, 그러면 [0, 1, 0, 1, 1, 1, 1, 1] 이 됩니다.

삭제 비트셋 del_bitset 의 경우 초기 값은 [0, 0, 0, 0, 0, 0, 1, 1] 이 되어야 합니다. 그러나 엔티티 7과 8은 ts 이 300이 될 때까지 삭제되지 않습니다. 따라서 ts 이 150일 때 엔티티 7과 8은 여전히 유효합니다. 결과적으로 시간 여행 후 del_bitset 값은 [0, 0, 0, 0, 0, 0, 0, 0] 입니다.

이제 시간 여행 및 속성 필터링 후에 filter_bitset [0, 1, 0, 1, 1, 1, 1, 1]del_bitset [0, 0, 0, 0, 0, 0, 0, 0] 두 개의 비트셋이 생겼습니다. 이 두 비트셋을 OR 이진 논리 연산자와 결합합니다. 결과_비트셋의 최종 값은 [0, 1, 0, 1, 1, 1, 1, 1] 이며, 이는 다음 검색 또는 쿼리 단계에서 엔티티 1과 3만 계산됨을 의미합니다.

Figure 1. Search with Time Travel = 150. 그림 1. 시간 여행 = 150으로 검색하기.

사례 2

이 경우 사용자는 time_travel 을 250으로 설정합니다. 비트셋 생성 과정은 그림 2에 설명되어 있습니다.

사례 1과 마찬가지로 초기 filter_bitset[1, 0, 1, 0, 1, 0, 1, 0] 입니다.

ts = 250일 때 모든 엔티티는 벡터 데이터베이스에 있습니다. 따라서 타임스탬프를 고려할 때 filter_bitset 는 동일하게 유지됩니다. 다시 결과를 뒤집어서 [0, 1, 0, 1, 0, 1, 0, 1] 를 얻어야 합니다.

삭제 비트셋 del_bitset 의 경우 초기 값은 [0, 0, 0, 0, 0, 0, 1, 1] 입니다. 그러나 엔티티 7과 8은 ts 이 300이 될 때까지 삭제되지 않았습니다. 따라서 ts 이 250일 때 엔티티 7과 8은 여전히 유효합니다. 결과적으로 시간 여행 후 del_bitset[0, 0, 0, 0, 0, 0, 0, 0] 입니다.

이제 시간 여행 및 속성 필터링 뒤에 filter_bitset [0, 1, 0, 1, 0, 1, 0, 1]del_bitset [0, 0, 0, 0, 0, 0, 0, 0] 두 개의 비트셋이 있습니다. 이 두 비트셋을 OR 이진 논리 연산자와 결합합니다. 결과_비트셋은 [0, 1, 0, 1, 0, 1, 0, 1] 입니다. 즉, 다음 검색 또는 쿼리 단계에서는 [1, 3, 5, 7] 엔티트만 계산됩니다.

Figure 2. Search with Time Travel = 250. 그림 2. 시간 여행 = 250으로 검색하기.

사례 3

이 경우 사용자는 time_travel 를 350으로 설정합니다. 비트셋 생성 과정은 그림 3에 설명되어 있습니다.

이전 사례와 마찬가지로 초기 filter_bitset[0, 1, 0, 1, 0, 1, 0, 1] 입니다.

ts= 350일 때 모든 엔티티는 벡터 데이터베이스에 있습니다. 따라서 최종적으로 뒤집힌 filter_bitset[0, 1, 0, 1, 0, 1, 0, 1] 으로 사례 2와 동일합니다.

삭제 비트셋 del_bitset 은 엔티티 7과 8이 ts = 350 일 때 이미 삭제되었으므로 del_bitset 의 결과는 [0, 0, 0, 0, 0, 0, 1, 1] 입니다.

이제 시간 여행 및 속성 필터링 후 두 개의 비트셋이 있습니다: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1]del_bitset [0, 0, 0, 0, 0, 0, 1, 1] . 이 두 비트셋을 OR 이진 논리 연산자와 결합합니다. 최종 result_bitset[0, 1, 0, 1, 0, 1, 1, 1] 입니다. 즉, 다음 검색 또는 쿼리 단계에서는 엔티티 [1, 3, 5]만 계산됩니다.

Figure 3. Search with Time Travel = 350. 그림 3. 시간 여행 = 350으로 검색하기.

다음 단계

이제 Milvus에서 비트셋이 어떻게 작동하는지 알았으니, 여러분도 해보고 싶을 것입니다:

번역DeepLogo

Try Managed Milvus for Free

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

Get Started
피드백

이 페이지가 도움이 되었나요?