メインコンテンツまでスキップ

BITMAP

ビットマップインデックスは、カーディナリティの低いスカラーフィールドに対するクエリパフォーマンスを向上させるために設計された効率的なインデックス手法です。カーディナリティとは、フィールド内の異なる値の数を指します。異なる要素が少ないフィールドは、低カーディナリティと見なされます。

このインデックスタイプは、フィールド値をコンパクトなバイナリ形式で表現し、それらに対して効率的なビット演算を実行することで、スカラークエリの取得時間を短縮するのに役立ちます。他のタイプのインデックスと比較して、ビットマップインデックスは通常、低カーディナリティのフィールドを扱う場合に高い空間効率と高速なクエリ速度を実現します。

概要​

ビットマップ という用語は、ビット と マップ という 2 つの単語を組み合わせたものです。ビットは、コンピューターにおけるデータの最小単位を表し、0 または 1 のいずれかの値しか保持できません。ここでのマップとは、0 と 1 にどの値を割り当てるかに従ってデータを変換および整理するプロセスを指します。

ビットマップインデックスは、ビットマップとキーという 2 つの主要なコンポーネントで構成されます。キーは、インデックス対象のフィールド内の一意の値を表します。一意の値ごとに、対応するビットマップが存在します。これらのビットマップの長さは、コレクション内のレコード数と同じです。ビットマップ内の各ビットは、コレクション内の 1 つのレコードに対応します。レコード内のインデックス対象フィールドの値がキーと一致する場合、対応するビットは 1 に設定され、それ以外の場合は 0 に設定されます。

Category と Public というフィールドを持つドキュメントのコレクションを考えてみましょう。Tech カテゴリに属し、Public に公開されているドキュメントを取得したいとします。この場合、ビットマップインデックスのキーは Tech と Public です。

S5cHwsXsPhOLfQb3Tatc4jqAn9e

図に示すように、Category と Public のビットマップインデックスは次のとおりです。

  • Tech: [1, 0, 1, 0, 0]。これは、1 番目と 3 番目のドキュメントのみが Tech カテゴリに属していることを示しています。

  • Public: [1, 0, 0, 1, 0]。これは、1 番目と 4 番目のドキュメントのみが Public に公開されていることを示しています。

両方の条件に一致するドキュメントを見つけるには、これら 2 つのビットマップに対してビット単位の AND 演算を実行します。

  • Tech AND Public: [1, 0, 0, 0, 0]

結果のビットマップ [1, 0, 0, 0, 0] は、最初のドキュメント(ID 1)のみが両方の条件を満たすことを示しています。ビットマップインデックスと効率的なビット演算を使用することで、検索範囲をすばやく絞り込み、データセット全体をスキャンする必要がなくなります。

ビットマップインデックスを作成する​

Zilliz Cloud でビットマップインデックスを作成するには、create_index() メソッドを使用し、index_type パラメーターを "BITMAP" に設定します。

python
from pymilvus import MilvusClient

client = MilvusClient(

uri="YOUR_CLUSTER_ENDPOINT",
)

index_params = client.prepare_index_params()

index_params.add_index(

field_name="category",
index_type="BITMAP",
index_name="category_bitmap_index"
)

client.create_index(

collection_name="my_collection",
index_params=index_params
)

この例では、my_collection コレクションの category フィールドにビットマップインデックスを作成します。add_index() メソッドは、フィールド名、インデックスの種類、およびインデックス名を指定するために使用します。

ビットマップインデックスを作成すると、クエリ操作で filter パラメーターを使用して、インデックス対象のフィールドに基づくスカラーフィルタリングを実行できます。これにより、ビットマップインデックスを使用して検索結果を効率的に絞り込むことができます。詳細については、フィルタリングの解説 を参照してください。

インデックスを削除する​

drop_index() メソッドを使用して、コレクションから既存のインデックスを削除します。

Notes

Milvus v2.6.x と互換性のあるクラスターでは、不要になったスカラーインデックスを直接削除できます。コレクションを先に解放する必要はありません。

python
client.drop_index(
collection_name="my_collection", # Name of the collection
index_name="category_bitmap_index" # Name of the index to drop
)

制限事項​

  • ビットマップインデックスは、主キー以外のスカラーフィールドでのみサポートされています。

  • フィールドのデータ型は、次のいずれかである必要があります。

    • BOOL, INT8, INT16, INT32, INT64, VARCHAR

    • ARRAY(要素は BOOL、INT8、INT16、INT32、INT64、VARCHAR のいずれかである必要があります)

  • ビットマップインデックスは、次のデータ型をサポートしていません。

    • FLOAT、DOUBLE:浮動小数点型は、ビットマップインデックスのバイナリとしての性質と互換性がありません。

    • JSON:JSON データ型は構造が複雑なため、ビットマップインデックスを使用して効率的に表現できません。

  • ビットマップインデックスは、カーディナリティの高いフィールド(つまり、異なる値の数が多いフィールド)には適していません。

    • 一般的な目安として、ビットマップインデックスは、フィールドのカーディナリティが 500 未満の場合に最も効果を発揮します。

    • カーディナリティがこのしきい値を超えて増加すると、ビットマップインデックスのパフォーマンス上のメリットは減少し、ストレージのオーバーヘッドが大きくなります。

    • カーディナリティの高いフィールドには、具体的なユースケースとクエリ要件に応じて、転置インデックスなどの代替のインデックス手法の使用を検討してください。