反転
データに対して頻繁にフィルタクエリを実行する必要がある場合、INVERTED インデックスはクエリパフォーマンスを劇的に向上させます。Milvusは全ての文書をスキャンする代わりに、転置インデックスを使用し、フィルタ条件に一致する正確なレコードを素早く探し出します。
転置インデックスを使用する場合
INVERTEDインデックスは以下のような場合に使用します:
特定の値でフィルタリングする:フィールドが特定の値に等しいすべてのレコードを検索します(例:
category == "electronics")。テキストコンテンツのフィルタリング:
VARCHARフィールドを効率的に検索する。JSONフィールド値のクエリ:JSON構造内の特定のキーにフィルターをかける
パフォーマンス上の利点: INVERTED インデックスは、コレクション全体のスキャンを不要にすることで、大規模なデータセットのクエリ時間を数秒から数ミリ秒に短縮することができます。
INVERTED インデックスの仕組み
MilvusのINVERTEDインデックスは、一意のフィールド値(用語)を、その値が出現するドキュメントIDの集合にマッピングします。この構造により、繰り返し値やカテゴリ値を持つフィールドの高速検索が可能になります。
図に示すように、処理は2つのステップで行われる:
前方マッピング(ID → 用語):各文書IDは、それが含むフィールド値を指す。
反転マッピング(用語 → ID):Milvusはユニークな用語を収集し、各用語からそれを含むすべてのIDへの逆マッピングを構築します。
例えば、"electronics "という値はID1と3に、"books "はID2と5にマッピングされます。
転置インデックスの仕組み
特定の値(例:category == "electronics")を検索する場合、Milvusは単純にインデックスでその用語を検索し、一致するIDを直接取得します。これにより、データセット全体をスキャンする必要がなくなり、特にカテゴリ値や繰り返し値の高速フィルタリングが可能になります。
INVERTEDインデックスは、BOOL、INT8、INT16、INT32、INT64、FLOAT、DOUBLE、VARCHAR、JSON、ARRAYなど、すべてのスカラーフィールド型をサポートしています。ただし、JSONフィールドにインデックスを作成する際のインデックス・パラメータは、通常のスカラー・フィールドとは若干異なります。
JSON以外のフィールドにインデックスを作成する
JSON以外のフィールドにインデックスを作成するには、以下の手順に従います:
インデックス・パラメータを準備する:
from pymilvus import MilvusClient client = MilvusClient(uri="http://localhost:19530") # Replace with your server address # Create an empty index parameter object index_params = client.prepare_index_params()INVERTEDインデックスを追加する:index_params.add_index( field_name="category", # Name of the field to index index_type="INVERTED", # Specify INVERTED index type index_name="category_index" # Give your index a name )インデックスを作成する:
client.create_index( collection_name="my_collection", # Replace with your collection name index_params=index_params )
JSONフィールドにインデックスを作成するCompatible with Milvus 2.5.11+
JSONフィールド内の特定のパスにINVERTEDインデックスを作成することもできます。これには、JSONパスとデータ型を指定する追加のパラメータが必要です:
# Build index params
index_params.add_index(
field_name="metadata", # JSON field name
index_type="INVERTED",
index_name="metadata_category_index",
params={
"json_path": "metadata[\"category\"]", # Path to the JSON key
"json_cast_type": "varchar" # Data type to cast to during indexing
}
)
# Create index
client.create_index(
collection_name="my_collection", # Replace with your collection name
index_params=index_params
)
サポートされているパス、データ型、制限など、JSONフィールド・インデックスの詳細については、「JSONインデックス」を参照してください。
インデックスの削除
コレクションから既存のインデックスを削除するには、drop_index() メソッドを使用します。
v2.6.3以前では、スカラインデックスを削除する前にコレクションを解放する必要があります。
v2.6.4以降では、スカラインデックスが不要になったら直接削除できる。
client.drop_index(
collection_name="my_collection", # Name of the collection
index_name="category_index" # Name of the index to drop
)
ベスト・プラクティス
データのロード後にインデックスを作成する:データをロードした後にインデックスを作成する。
説明的なインデックス名を使用する:フィールドと目的を明確に示す名前を選択する
インデックスのパフォーマンスを監視する:インデックス作成前と作成後のクエリパフォーマンスをチェックする
クエリのパターンを考慮する:頻繁にフィルタリングするフィールドにインデックスを作成する
次のステップ
高度な JSON インデックス作成シナリオについては、JSON インデックス作成を参照してください。