ビットマップ
ビットマップインデックスは、カーディナリティの低いスカラーフィールドのクエリ性能を向上させるために考案された効率的なインデックス作成手法です。カーディナリティとは、フィールド内の別個の値の数を指す。別個の要素が少ないフィールドは低カーディナリティとみなされます。
このインデックス・タイプは、フィールド値をコンパクトなバイナリ形式で表現し、それに対して効率的なビット演算を実行することで、スカラ・クエリの検索時間を短縮するのに役立つ。他のタイプのインデックスと比較して、ビットマップインデックスは一般的にスペース効率が高く、カーディナリティの低いフィールドを扱う際のクエリ速度が速くなります。
概要
ビットマップという用語は、2つの単語を組み合わせたものである:ビットと マップです。ビットはコンピュータにおけるデータの最小単位を表し、0か 1のいずれかの値しか保持できない。マップとは、この文脈では、0と1にどのような値を割り当てるべきかに従ってデータを変換し、整理するプロセスを指す。
ビットマップインデックスは、ビットマップとキーという2つの主要な構成要素からなる。キーはインデックスされたフィールドの一意な値を表す。各一意な値に対して、対応するビットマップがある。これらのビットマップの長さは、コレクション内のレコード数に等しい。ビットマップの各ビットは、コレクション内のレコードに対応する。レコード内のインデックス付きフィールドの値がキーと一致する場合、対応するビットは1にセットされ、そうでない場合は0にセットされる。
Categoryと Publicのフィールドを持つドキュメントのコレクションを考える。Techカテゴリに分類され、Publicに公開されている文書を取得したい。この場合、ビットマップインデックスのキーはTechと Publicになります。
ビットマップ
図に示すように、Categoryと Publicのビットマップインデックスは以下のようになります:
Tech:[1, 0, 1, 0, 0]であり、1番目と3番目の文書だけがTechカテゴリに分類されることがわかる。
公開:[1, 0, 0, 1, 0]。これは、1番目と4番目のドキュメントだけが公開されていることを示しています。
両方の条件に一致する文書を見つけるために、これら2つのビットマップに対してビットごとのAND演算を実行します:
- 技術AND公開:[1, 0, 0, 0, 0]
結果として得られるビットマップ[1, 0, 0, 0, 0]は、最初の文書(ID 1)のみが両方の基準を満たすことを示している。ビットマップインデックスと効率的なビット演算を使うことで、検索範囲をすばやく絞り込むことができ、データセット全体をスキャンする必要がなくなる。
ビットマップインデックスの作成
Milvusでビットマップインデックスを作成するには、create_index() メソッドを使用し、index_type パラメータを"BITMAP" に設定する。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
)
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 パラメータを使用して、インデックスが作成されたフィールドに基づくスカラー・フィルタリングを実行できます。これにより、ビットマップインデックスを使用して検索結果を効率的に絞り込むことができます。詳細については、フィルタリングの説明を参照してください。
インデックスの削除
コレクションから既存のインデックスを削除するには、drop_index() メソッドを使用します。
v2.6.3以前では、スカラー・インデックスを削除する前にコレクションを解放する必要があります。
v2.6.4以降では、スカラー・インデックスが不要になったら直接削除できます。
client.drop_index(
collection_name="my_collection", # Name of the collection
index_name="category_bitmap_index" # Name of the index to drop
)
制限
ビットマップインデックスは、主キーでないスカラフィールドに対してのみサポートされます。
フィールドのデータ型は以下のいずれかでなければならない:
BOOLINT8, , , 、INT16INT32INT64VARCHARARRAY(要素は以下のいずれかでなければならない:BOOL,INT8,INT16,INT32,INT64,VARCHAR)。
ビットマップインデックスは以下のデータ型をサポートしていません:
FLOATDOUBLE: 浮動小数点型は、ビットマップインデックスのバイナリの性質と互換性がありません。JSON:JSONデータ型は、ビットマップインデックスを使用して効率的に表現できない複雑な構造を持っています。
ビットマップインデックスは、カーディナリティの高いフィールド(すなわち、多数の異なる値を持つフィールド)には適していません。
一般的なガイドラインとして、ビットマップインデックスはフィールドのカーディナリティが500未満のときに最も効果的です。
カーディナリティがこの閾値を超えると、ビットマップインデックスの性能上の利点は減少し、ストレージのオーバーヘッドが大きくなります。
カーディナリティの高いフィールドについては、特定のユースケースやクエリ要件に応じて、転置インデックスなどの別のインデックス作成技術の使用を検討してください。