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

Boolean & Number

Booleanまたはnumberフィールドは、Boolean値または数値を格納するスカラーフィールドです。これらの値は、2つの可能な値のいずれか、または整数(integers)と小数(floating-point numbers)のいずれかです。これらは通常、数量、測定値、または論理的または数学的に処理する必要があるデータを表すために使用されます。

以下の表は、Zilliz Cloudクラスターで利用可能なnumberフィールドのデータ型を説明しています。

フィールド型

説明

BOOL

trueまたはfalseを格納するためのBoolean型で、2値状態を記述するのに適しています。

INT8

8ビット整数で、小範囲の整数データを格納するのに適しています。

INT16

16ビット整数で、中程度の範囲の整数データ用です。

INT32

32ビット整数で、商品数量やユーザーIDなどの一般的な整数データ保存に最適です。

INT64

64ビット整数で、タイムスタンプや識別子など、大範囲データの保存に適しています。

FLOAT

32ビット浮動小数点数で、評価や温度などの一般精度が必要なデータ用です。

DOUBLE

64ビット倍精度浮動小数点数で、財務情報や科学計算など、高精度データ用です。

Booleanフィールドを宣言するには、単にdatatypeBOOLに設定します。Numberフィールドを宣言するには、利用可能な数値データ型のいずれかに設定します。たとえば、整数フィールドにはDataType.INT64、浮動小数点フィールドにはDataType.FLOATを設定します。

📘注釈

Zilliz Cloudはbooleanおよびnumberフィールドのnull値とデフォルト値をサポートしています。これらの機能を有効にするには、nullableTrueに、default_valueを数値に設定します。詳細については、Nullable & Defaultを参照してください。

BooleanおよびNumberフィールドの追加

Booleanまたは数値データを保存するには、コレクションスキーマで対応する型のフィールドを定義します。以下は、2つのnumberフィールドを持つコレクションスキーマの例です:

  • age:整数データを格納し、null値を許可し、デフォルト値が18です。

  • broken:Booleanデータを格納し、null値を許可しますが、デフォルト値は設定されていません。

  • price:浮動小数点データを格納し、null値を許可しますが、デフォルト値は設定されていません。

📘注釈

スキーマ定義時にenable_dynamic_fields=Trueを設定すると、Zilliz Cloudは事前に定義されていないスカラーフィールドの挿入を許可します。ただし、これによりクエリや管理の複雑さが増し、パフォーマンスに影響を与える可能性があります。詳細については、Dynamic Fieldを参照してください。

# 必要なライブラリをインポート
from pymilvus import MilvusClient, DataType

# サーバーアドレスを定義
SERVER_ADDR = "YOUR_CLUSTER_ENDPOINT"

# MilvusClientインスタンスを作成
client = MilvusClient(uri=SERVER_ADDR)

# コレクションスキーマを定義
schema = client.create_schema(
auto_id=False,
enable_dynamic_fields=True,
)

# null値をサポートし、デフォルト値が18のINT64フィールド`age`を追加
schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True, default_value=18)
schema.add_field(field_name="broken", datatype=DataType.BOOL, nullable=True)
# null値をサポートするFLOATフィールド`price`を追加(デフォルト値なし)
schema.add_field(field_name="price", datatype=DataType.FLOAT, nullable=True)
schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)

インデックスパラメータの設定

インデックス作成は、検索およびクエリのパフォーマンス向上に役立ちます。Zilliz Cloudクラスターでは、ベクトルフィールドのインデックス作成は必須ですが、スカラーフィールドでは任意です。

以下の例では、ベクトルフィールドembeddingとスカラーフィールドageの両方にAUTOINDEXインデックスタイプを使用してインデックスを作成します。このタイプでは、Milvusがデータ型に基づいて最も適切なインデックスを自動的に選択します。詳細については、AUTOINDEXの説明を参照してください。

# インデックスパラメータを設定

index_params = client.prepare_index_params()

# AUTOINDEXで`age`をインデックス化
index_params.add_index(
field_name="age",
index_type="AUTOINDEX",
index_name="age_index"
)

# AUTOINDEXで`embedding`をインデックス化し、類似性メトリックタイプを指定
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX", # 自動インデックスを使用して複雑なインデックス設定を簡略化
metric_type="COSINE" # 類似性メトリックタイプを指定。オプションにはL2、COSINE、またはIPが含まれます
)

コレクションの作成

スキーマとインデックスが定義されたら、numberフィールドを含むコレクションを作成します。

# コレクションを作成
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

データ挿入

コレクションを作成した後、スキーマに一致するエンティティを挿入します。

# サンプルデータ
data = [
{"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},
{"age": 30, "pk": 2, "embedding": [0.4, 0.5, 0.6]}, # `price`フィールドが欠落しており、nullになる必要があります
{"age": None, "price": None, "pk": 3, "embedding": [0.2, 0.3, 0.1]}, # `age`はデフォルトで18、`price`はnull
{"age": 45, "price": None, "pk": 4, "embedding": [0.9, 0.1, 0.4]}, # `price`はnull
{"age": None, "price": 59.99, "pk": 5, "embedding": [0.8, 0.5, 0.3]}, # `age`はデフォルトで18
{"age": 60, "price": None, "pk": 6, "embedding": [0.1, 0.6, 0.9]} # `price`はnull
]

client.insert(
collection_name="my_collection",
data=data
)

フィルター式を使用したクエリ

エンティティを挿入した後、queryメソッドを使用して指定されたフィルター式に一致するエンティティを取得します。

ageが30より大きいエンティティを取得するには:

filter = 'age > 30'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["age", "price", "pk"]
)

print(res)

# 例の出力:
# data: [
# "{'age': 45, 'price': None, 'pk': 4}",
# "{'age': 60, 'price': None, 'pk': 6}"
# ]

priceがnullであるエンティティを取得するには:

filter = 'price is null'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["age", "price", "pk"]
)

print(res)

# 例の出力:
# data: [
# "{'age': 30, 'price': None, 'pk': 2}",
# "{'age': 18, 'price': None, 'pk': 3}",
# "{'age': 45, 'price': None, 'pk': 4}",
# "{'age': 60, 'price': None, 'pk': 6}"
# ]

ageが値18を持っているエンティティを取得するには、以下の式を使用します。ageのデフォルト値は18なので、予想される結果にはageが明示的に18に設定されたエンティティまたはageがnullに設定されたエンティティが含まれる必要があります。

filter = 'age == 18'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["age", "price", "pk"]
)

print(res)

# 例の出力:
# data: [
# "{'age': 18, 'price': None, 'pk': 3}",
# "{'age': 18, 'price': 59.99, 'pk': 5}"
# ]

フィルター式を用いたベクトル検索

基本的なnumberフィールドのフィルタリングに加えて、ベクトル類似性検索をnumberフィールドフィルターと組み合わせることができます。たとえば、以下のコードはベクトル検索にnumberフィールドフィルターを追加する方法を示しています:

filter = "25 <= age <= 35"

res = client.search(
collection_name="my_collection",
data=[[0.3, -0.6, 0.1]],
limit=5,
search_params={"params": {"nprobe": 10}},
output_fields=["age","price"],
filter=filter
)

print(res)

# 例の出力:
# data: [
# "[{'id': 2, 'distance': -0.2016308456659317, 'entity': {'age': 30, 'price': None}}, {'id': 1, 'distance': -0.23643313348293304, 'entity': {'age': 25, 'price': 99.98999786376953}}]"
# ]

この例では、まずクエリベクトルを定義し、検索中にフィルター条件25 <= age <= 35を追加します。これにより、検索結果はクエリベクトルと類似しているだけでなく、指定された年齢範囲を満たします。詳細については、フィルタリングを参照してください.