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

INVERTED

データに対して頻繁にフィルタークエリを実行する必要がある場合、INVERTED インデックスによってクエリパフォーマンスを大幅に向上できます。Zilliz Cloud は、すべてのドキュメントをスキャンする代わりに転置インデックスを使用して、フィルター条件に一致する正確なレコードをすばやく特定します。

INVERTED インデックスを使用する場合​

INVERTED インデックスは、次のような場合に使用します。

  • 特定の値でフィルタリングする: フィールドが特定の値と等しいすべてのレコードを検索します(例: category == "electronics")

  • テキストコンテンツをフィルタリングする: VARCHAR フィールドに対して効率的な検索を実行します

  • JSON フィールドの値をクエリする: JSON 構造内の特定のキーでフィルタリングします

パフォーマンス上の利点: INVERTED インデックスは、コレクション全体のスキャンが不要になるため、大規模なデータセットでクエリ時間を秒単位からミリ秒単位に短縮できます。

INVERTED インデックスの仕組み​

Zilliz Cloud の INVERTED インデックスは、各一意のフィールド値(ターム)を、その値が出現するドキュメント ID のセットにマッピングします。この構造により、値が繰り返されるフィールドやカテゴリ型の値を持つフィールドを高速に検索できます。

図に示すように、このプロセスは 2 つのステップで機能します。

  1. 順方向マッピング(ID → ターム): 各ドキュメント ID は、それが含むフィールド値を指します。

  2. 転置マッピング(ターム → ID): Zilliz Cloud は一意のタームを収集し、各タームからそのタームを含むすべての ID への逆マッピングを構築します。

たとえば、値 "electronics" は ID 1 と 3 にマッピングされ、"books" は ID 2 と 5 にマッピングされます。

A19NwPlGIh1YrGbSBZKcNKz0nhd

特定の値(例: category == "electronics")でフィルタリングする場合、Zilliz Cloud はインデックス内のタームを検索し、一致する ID を直接取得するだけです。これによりデータセット全体のスキャンが回避され、特にカテゴリ型の値や繰り返される値に対して高速なフィルタリングが可能になります。

INVERTED インデックスは、BOOL、INT8、INT16、INT32、INT64、FLOAT、DOUBLE、VARCHAR、JSON、ARRAY などのすべてのスカラーフィールドタイプをサポートします。ただし、JSON フィールドをインデックス化するためのインデックスパラメーターは、通常のスカラーフィールドとは少し異なります。

JSON 以外のフィールドにインデックスを作成する​

JSON 以外のフィールドにインデックスを作成するには、次のステップに従います。

  1. インデックスパラメーターを準備します。

    python
    from pymilvus import MilvusClient

    client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT") # Replace with your server address

    # Create an empty index parameter object
    index_params = client.prepare_index_params()
  2. INVERTED インデックスを追加します。

    python
    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
    )
  3. インデックスを作成します。

    python
    client.create_index(
    collection_name="my_collection", # Replace with your collection name
    index_params=index_params
    )

JSON フィールドにインデックスを作成する​

JSON フィールド内の特定のパスに INVERTED インデックスを作成することもできます。そのためには、JSON パスとデータタイプを指定する追加のパラメーターが必要です。

python
# 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 Indexing を参照してください。

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

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

Notes

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

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

ベストプラクティス​

  • データをロードしてからインデックスを作成する: パフォーマンスを向上させるため、すでにデータが含まれているコレクションにインデックスを構築します

  • わかりやすいインデックス名を使用する: フィールドと目的を明確に示す名前を選択します

  • インデックスのパフォーマンスを監視する: インデックスを作成する前後でクエリパフォーマンスを確認します

  • クエリパターンを考慮する: 頻繁にフィルタリングするフィールドにインデックスを作成します

次のステップ​

  • AUTOINDEX について学習します。

  • 高度な JSON インデックス作成シナリオについては、JSON Indexing を参照してください。