비트셋
이 주제에서는 Milvus에서 속성 필터링 및 삭제 작업과 같은 주요 기능을 활성화하는 데 도움이 되는 비트셋 메커니즘을 소개합니다.
개요
비트셋은 비트의 집합입니다. 비트는 일반적으로 0
및 1
또는 부울 값 true
및 false
과 같이 두 가지 값만 가능한 요소입니다. Milvus에서 비트셋은 비트 번호 0
및 1
의 배열로, 특정 데이터를 정수, 부동 소수점 또는 문자 대신 간결하고 효율적으로 표현하는 데 사용할 수 있습니다. 비트 번호는 기본적으로 0
이며, 특정 요구 사항을 충족하는 경우에만 1
으로 설정됩니다.
비트셋에 대한 연산은 출력 값이 유효하거나 유효하지 않은 부울 논리로 수행되며, 각각 1
및 0
으로도 표시됩니다. 예를 들어 논리 연산자 AND
를 사용하여 동일한 인덱스 위치에 있는 항목을 기준으로 두 비트셋을 비교하고 그 결과로 새 비트셋을 생성할 수 있습니다. 한 위치의 두 항목이 같으면 새 비트셋에 1
, 다르면 0
이 해당 위치에 기록됩니다.
구현
비트셋은 Milvus가 시간 여행을 통해 속성 필터링, 데이터 삭제 및 쿼리를 수행하는 데 도움이 되는 간단하면서도 강력한 메커니즘입니다.
속성 필터링
비트셋은 두 가지 가능한 값만 포함하므로 속성 필터링의 결과를 저장하는 데 적합합니다. 주어진 속성 필터의 요구 사항을 충족하는 데이터는 1
로 표시됩니다.
데이터 삭제
비트셋은 세그먼트의 행이 삭제되었는지 여부에 대한 정보를 간결하게 저장하는 역할을 합니다. 삭제된 엔티티는 해당 비트셋에 1
로 표시되며, 검색 또는 쿼리 중에 계산되지 않습니다.
예제
여기에서는 위에서 설명한 비트셋의 세 가지 주요 구현을 모두 참조하여 Milvus에서 비트셋이 어떻게 사용되는지 보여주는 세 가지 예를 제시합니다. 세 가지 경우 모두 8개의 엔티티가 있는 세그먼트가 있고, 그 다음 일련의 데이터 조작 언어(DML) 이벤트가 아래 표시된 순서대로 발생합니다.
primary_key
s가 각각 [1, 2, 3, 4]인 4개의 엔티티는 타임스탬프ts
가 100과 같을 때 삽입됩니다.primary_key
s가 [5, 6, 7, 8]인 나머지 4개 엔티티는 타임스탬프ts
가 200일 때 삽입됩니다.primary_key
s가 [7, 8]인 엔티티는 타임스탬프ts
가 300일 때 삭제됩니다.primary_key
s가 [1, 3, 5, 7]인 엔티티만 속성 필터링 조건을 충족합니다.
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만 계산됨을 의미합니다.
그림 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] 엔티트만 계산됩니다.
그림 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]만 계산됩니다.
그림 3. 시간 여행 = 350으로 검색하기.
다음 단계
이제 Milvus에서 비트셋이 어떻게 작동하는지 알았으니, 여러분도 해보고 싶을 것입니다:
- 문자열을 사용하여 검색 결과를 필터링하는 방법을 알아보거나, 문서에서 하이브리드 검색을 참조하세요.
- Milvus에서 데이터가 처리되는 방식을 이해합니다.