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

Boolean と数値

Boolean フィールドまたは数値フィールドは、Boolean 値または数値を格納するスカラー型フィールドです。これらの値は、2 つの取りうる値のいずれか、または整数(整数値)および小数(浮動小数点数)です。通常、数量、測定値、または論理的もしくは数学的に処理する必要のあるデータを表すために使用されます。

次の表は、Zilliz Cloud クラスターで使用できる数値フィールドのデータ型について説明しています。

フィールド型説明
BOOLtrue または false を格納する Boolean 型で、バイナリ状態を表すのに適しています。
INT88 ビット整数で、範囲の狭い整数データを格納するのに適しています。
INT1616 ビット整数で、中程度の範囲の整数データに適しています。
INT3232 ビット整数で、製品の数量やユーザー ID などの一般的な整数データの保存に最適です。
INT6464 ビット整数で、タイムスタンプや識別子など、広い範囲のデータを格納するのに適しています。
FLOAT32 ビット浮動小数点数で、評価や温度など、一般的な精度を必要とするデータに適しています。
DOUBLE64 ビット倍精度浮動小数点数で、財務情報や科学計算などの高精度データに適しています。

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

📘Notes

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

Boolean フィールドと数値フィールドを追加する​

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

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

  • broken: Boolean データを格納し、null 値を許可しますが、デフォルト値はありません。

  • price: 浮動小数点データを格納し、null 値を許可しますが、デフォルト値はありません。

📘Notes

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

python
# Import necessary libraries
from pymilvus import MilvusClient, DataType

# Define server address
SERVER_ADDR = "YOUR_CLUSTER_ENDPOINT"

# Create a MilvusClient instance
client = MilvusClient(uri=SERVER_ADDR)

# Define the collection schema
schema = client.create_schema(
auto_id=False,
enable_dynamic_field=True,
)

# Add an INT64 field `age` that supports null values with default value 18
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)
# Add a FLOAT field `price` that supports null values without default value
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 クラスターでは、ベクトルフィールドのインデックス作成は必須ですが、スカラーフィールドでは任意です。

The following example creates インデックス on the ベクトル field embedding and the スカラー field age, both using the AUTOINDEX インデックス type. With this type, Zilliz Cloud automatically selects the most suitable index based on the data type. For details, refer to Index Explained.

python
# Set index params

index_params = client.prepare_index_params()

# Index `age` with AUTOINDEX
index_params.add_index(
field_name="age",
index_type="AUTOINDEX",
index_name="age_index"
)

# Index `embedding` with AUTOINDEX and specify similarity metric type
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX", # Use automatic indexing to simplify complex index settings
metric_type="COSINE" # Specify similarity metric type, options include L2, COSINE, or IP
)

コレクションを作成する​

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

python
# Create Collection
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

データを挿入する​

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

python
# Sample data
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` field is missing, which should be null
{"age": None, "price": None, "pk": 3, "embedding": [0.2, 0.3, 0.1]}, # `age` should default to 18, `price` is null
{"age": 45, "price": None, "pk": 4, "embedding": [0.9, 0.1, 0.4]}, # `price` is null
{"age": None, "price": 59.99, "pk": 5, "embedding": [0.8, 0.5, 0.3]}, # `age` should default to 18
{"age": 60, "price": None, "pk": 6, "embedding": [0.1, 0.6, 0.9]} # `price` is null
]

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

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

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

age が 30 より大きいエンティティを取得するには、次のようにします。

python
filter = 'age > 30'

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

print(res)

# Example output:
# data: [
# "{'age': 45, 'price': None, 'pk': 4}",
# "{'age': 60, 'price': None, 'pk': 6}"
# ]

price が null のエンティティを取得するには、次のようにします。

python
filter = 'price is null'

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

print(res)

# Example output:
# 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 に設定されたエンティティが含まれるはずです。

python
filter = 'age == 18'

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

print(res)

# Example output:
# data: [
# "{'age': 18, 'price': None, 'pk': 3}",
# "{'age': 18, 'price': 59.99, 'pk': 5}"
# ]

フィルター式を使用したベクトル検索​

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

python
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)

# Example output:
# 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 を追加します。これにより、検索結果がクエリベクトルに類似しているだけでなく、指定された年齢範囲も満たすことが保証されます。詳細は、フィルタリングの概要 を参照してください。