비트맵
비트맵 인덱싱은 카디널리티가 낮은 스칼라 필드에서 쿼리 성능을 개선하기 위해 고안된 효율적인 인덱싱 기법입니다. 카디널리티는 필드에 있는 고유 값의 수를 나타냅니다. 고유 요소가 적은 필드는 카디널리티가 낮은 필드로 간주됩니다.
이 인덱스 유형은 필드 값을 간결한 이진 형식으로 표현하고 효율적인 비트 단위 연산을 수행하여 스칼라 쿼리의 검색 시간을 단축하는 데 도움이 됩니다. 다른 유형의 인덱스에 비해 비트맵 인덱스는 일반적으로 카디널리티가 낮은 필드를 처리할 때 공간 효율성이 높고 쿼리 속도가 빠릅니다.
개요
비트맵이라는 용어는 두 단어를 결합한 것입니다: 비트와 맵입니다. 비트는 컴퓨터에서 가장 작은 데이터 단위를 나타내며, 0 또는 1의 값만 저장할 수 있습니다. 여기서 맵은 0과 1에 어떤 값을 할당해야 하는지에 따라 데이터를 변환하고 구성하는 프로세스를 의미합니다.
비트맵 인덱스는 비트맵과 키라는 두 가지 주요 구성 요소로 이루어져 있습니다. 키는 인덱싱된 필드에 있는 고유 값을 나타냅니다. 각 고유 값마다 해당 비트맵이 있습니다. 이러한 비트맵의 길이는 컬렉션의 레코드 수와 같습니다. 비트맵의 각 비트는 컬렉션의 레코드에 해당합니다. 레코드에서 인덱싱된 필드의 값이 키와 일치하면 해당 비트는 1로 설정되고, 그렇지 않으면 0으로 설정됩니다.
Category 및 Public 필드가 있는 문서 컬렉션을 예로 들어 보겠습니다. 기술 카테고리에 속하고 공개되어 있는 문서를 검색하려고 합니다. 이 경우 비트맵 인덱스의 키는 Tech와 Public입니다.
비트맵 인덱싱
그림에서 보는 바와 같이 Category 및 Public에 대한 비트맵 인덱스는 다음과 같습니다.
Tech: [1, 0, 1, 0, 0]이며, 이는 첫 번째와 세 번째 문서만 Tech 카테고리에 속한다는 것을 보여줍니다.
Public: [1, 0, 0, 1, 0]은 1번째와 4번째 문서만 공개 문서에 해당됨을 나타냅니다.
두 기준에 모두 일치하는 문서를 찾기 위해 이 두 비트맵에 대해 비트 단위 AND 연산을 수행합니다.
- 기술 및 공개: [1, 0, 0, 0, 0]
결과 비트맵 [1, 0, 0, 0, 0, 0]은 첫 번째 문서(ID 1)만이 두 기준을 모두 만족한다는 것을 나타냅니다. 비트맵 인덱스와 효율적인 비트 단위 연산을 사용하면 전체 데이터 세트를 스캔할 필요 없이 검색 범위를 빠르게 좁힐 수 있습니다.
비트맵 인덱스 만들기
Milvus에서 비트맵 인덱스를 생성하려면 create_index()
방법을 사용하고 index_type
파라미터를 "BITMAP"
로 설정합니다.
from pymilvus import MilvusClient
index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
index_params.add_index(
field_name="category", # Name of the scalar field to be indexed
index_type="BITMAP", # Type of index to be created
index_name="category_bitmap_index" # Name of the index to be created
)
client.create_index(
collection_name="my_collection", # Specify the collection name
index_params=index_params
)
이 예에서는 my_collection
컬렉션의 category
필드에 비트맵 인덱스를 생성합니다. add_index()
메서드는 필드 이름, 인덱스 유형 및 인덱스 이름을 지정하는 데 사용됩니다.
비트맵 인덱스가 생성되면 쿼리 작업에서 filter
매개변수를 사용하여 인덱싱된 필드를 기반으로 스칼라 필터링을 수행할 수 있습니다. 이렇게 하면 비트맵 인덱스를 사용하여 검색 결과의 범위를 효율적으로 좁힐 수 있습니다. 자세한 내용은 메타데이터 필터링을 참조하세요.
제한 사항
비트맵 인덱스는 기본 키가 아닌 스칼라 필드에 대해서만 지원됩니다.
필드의 데이터 유형은 다음 중 하나여야 합니다.
BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
ARRAY
(요소는BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
) 중 하나여야 합니다.
비트맵 인덱스는 다음 데이터 유형을 지원하지 않습니다.
FLOAT
,DOUBLE
: 부동소수점 유형은 비트맵 인덱스의 이진 특성과 호환되지 않습니다.JSON
: JSON 데이터 유형은 비트맵 인덱스를 사용하여 효율적으로 표현할 수 없는 복잡한 구조를 가지고 있습니다.
비트맵 인덱스는 카디널리티가 높은 필드(즉, 고유값이 많은 필드)에는 적합하지 않습니다.
일반적인 지침으로, 비트맵 인덱스는 필드의 카디널리티가 500 미만일 때 가장 효과적입니다.
카디널리티가 이 임계값 이상으로 증가하면 비트맵 인덱스의 성능 이점이 줄어들고 스토리지 오버헤드가 크게 증가합니다.
카디널리티가 높은 필드의 경우, 특정 사용 사례와 쿼리 요구 사항에 따라 역 인덱스와 같은 대체 인덱싱 기술을 사용하는 것을 고려하세요.