メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

スカラーフィールドのインデックス作成

Zilliz Cloud は、スカラーフィールド(非ベクトルフィールド)に対するインデックス作成をサポートしており、特に大規模なデータセットにおいてフィルタリングと検索のパフォーマンスを大幅に向上させます。

概要

スカラーフィールドのインデックス作成は必須ではありませんが、特定のスカラフィールドをフィルタ条件で頻繁にアクセスする場合は推奨されます。

Zilliz Cloud は、以下のフィールドタイプに対して AUTOINDEX をサポートしています:

フィールドタイプ

AUTOINDEX の解決結果

説明

VARCHAR

BITMAP (C* < 100) / INVERTED ( C ≥ 100)

文字列データタイプ。詳細については、String Field を参照してください。

INT8, INT16, INT32, INT64

BITMAP (C < 100) / STL_SORT (C ≥ 100)

整数。詳細については、Boolean & Number を参照してください。

FLOAT, DOUBLE

BITMAP (C* < 100) / INVERTED ( C ≥ 100)

浮動小数点数。詳細については、Boolean & Number を参照してください。

BOOL

BITMAP

ブール値。詳細については、Boolean & Number を参照してください。

ARRAY

BITMAP (C* < 100) / INVERTED ( C ≥ 100)

スカラー値の同種配列。詳細については、配列 Field を参照してください。

GEOMETRY

RTREE

空間情報を格納する幾何学データ。詳細については、ジオメトリ Field を参照してください。

TIMESTAMPTZ

STL_SORT

タイムゾーン対応の ISO 8601 入力。UTC として保存され、タイムゾーン間での一貫したフィルタリングと順序付けが可能になります。詳細については、TIMESTAMPTZ Field を参照してください。

📘注記

カーディナリティ(上記表の C)は、コレクション全体におけるフィールド内の一意な値の数を示します。例えば、浮動小数点フィールドのカーディナリティは、そのフィールド内の異なる浮動小数点値の数です。

配列フィールドの場合、カーディナリティはセグメント内のすべての配列にわたる固有の要素値の数です。例えば:

[1, 2, 3]
[2, 3, 4]
[1, 4, 5]

固有の要素値は \{1, 2, 3, 4, 5\} → カーディナリティ = 5 です。これは、すべての配列からすべての要素を平坦化し、一意の値を数えたものであり、異なる配列の数や配列の長さではありません。

準備

インデックスを作成する前に、ベクトルフィールドとスカラーフィールドの両方を含むコレクションを定義する必要があります。Zilliz Cloud では、すべてのコレクションにベクトルフィールドが必要です。

この例では、必須のベクトルフィールド(vector)と DOUBLE タイプのスカラーフィールド(price)を含む製品カタログのスキーマを定義します:

from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT") # Replace with your cluster endpoint

# Define schema with dynamic field support
schema = client.create_schema(
auto_id=False,
enable_dynamic_field=True # Enable dynamic field
)

# Define fields
schema.add_field(field_name="product_id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5) # Vector field
schema.add_field(field_name="price", datatype=DataType.DOUBLE) # Scalar field

# Create the collection
client.create_collection(
collection_name="product_catalog",
schema=schema
)

スカラー型フィールドにインデックスを作成する

AUTOINDEX を使用してスカラー型フィールドにインデックスを作成できます。追加のインデックスパラメータは不要です。以下の例では、price フィールドにインデックスを作成しています:

index_params = client.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters

index_params.add_index(
field_name="price", # Name of the scalar field to be indexed
index_type="AUTOINDEX", # Type of index to be created
index_name="price_index" # Name of the index to be created
)

インデックスパラメータを定義した後、create_index() を使用してコレクションに適用できます。

client.create_index(
collection_name="product_catalog",
index_params=index_params
)

インデックスの詳細を確認する

インデックスを作成したら、その詳細を確認できます。

# Describe index
res = client.list_indexes(
collection_name="product_catalog"
)

print(res)

res = client.describe_index(
collection_name="product_catalog",
index_name="price_index"
)

print(res)

インデックスの削除

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

📘注記

Milvus v2.6.x と互換性のあるクラスターでは、不要になったスカラーインデックスを、コレクションを最初にリリースすることなく直接削除できます。

# Drop index
client.drop_index(
collection_name="product_catalog",
index_name="price_index"
)

高度な機能

スカラーインデックスに関して、他にもいくつかの高度な機能があります。

NGRAM [READ MORE]

Zilliz Cloud の `NGRAM` インデックスは、`VARCHAR` フィールドまたは `JSON` フィールド内の特定の JSON パスに対する `LIKE` クエリを高速化するために構築されています。インデックスの作成前に、Zilliz Cloud はテキストを n と呼ばれる固定長の短く重なり合う部分文字列(n-gram)に分割します。例えば、n = 3 の場合、「Milvus」という単語は「Mil」、「ilv」、「lvu」、「vus」という 3-gram に分割されます。これらの n-gram は、各 gram が出現するドキュメント ID をマッピングする転置インデックスに格納されます。クエリ実行時、このインデックスにより Zilliz Cloud は検索対象を少数の候補に迅速に絞り込むことができ、クエリの実行が大幅に高速化されます。