ビットマップ
ビットマップインデックスは、カーディナリティの低いスカラーフィールドのクエリ性能を向上させるために考案された効率的なインデックス作成手法です。カーディナリティとは、フィールド内の別個の値の数を指す。異なる要素の数が少ないフィールドは、低カーディナリティとみなされます。
このインデックス・タイプは、フィールド値をコンパクトなバイナリ形式で表現し、それに対して効率的なビット演算を実行することで、スカラ・クエリの検索時間を短縮するのに役立つ。他のタイプのインデックスと比較して、ビットマップインデックスは一般的にスペース効率が高く、カーディナリティの低いフィールドを扱う際のクエリ速度が速くなります。
概要
ビットマップという用語は、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
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未満のときに最も効果的です。
カーディナリティがこの閾値を超えると、ビットマップインデックスのパフォーマンス上の利点は減少し、ストレージのオーバーヘッドが大きくなります。
カーディナリティの高いフィールドについては、特定のユースケースやクエリ要件に応じて、転置インデックスなどの別のインデックス作成技術の使用を検討してください。