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

ブール値と数値

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

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

フィールドタイプ説明
BOOLtrue または false を格納するブール型で、二値状態の記述に適しています。
INT88 ビット整数で、小さな範囲の整数データの格納に適しています。
INT1616 ビット整数で、中程度の範囲の整数データ向けです。
INT3232 ビット整数で、商品数量やユーザー ID など、一般的な整数データの保存に最適です。
INT6464 ビット整数で、タイムスタンプや識別子のような大きな範囲のデータの格納に適しています。
FLOAT32 ビット浮動小数点数で、評価値や温度など、一般的な精度が必要なデータ向けです。
DOUBLE64 ビット倍精度浮動小数点数で、金融情報や科学計算のような高精度データ向けです。

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

📘Notes

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

ブール値フィールドと数値フィールドの追加

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

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

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

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

📘Notes

スキーマを定義する際に enable_dynamic_fields=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_fields=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 クラスターでは、ベクトルフィールドに対するインデックス作成は必須ですが、スカラーフィールドに対しては任意です。

次の例では、ベクトルフィールド embedding とスカラーフィールド age の両方に AUTOINDEX インデックスタイプを使用してインデックスを作成します。このタイプでは、Milvus がデータ型に基づいて最も適切なインデックスを自動的に選択します。詳細については、AUTOINDEX 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 を追加します。これにより、検索結果はクエリベクトルに類似しているだけでなく、指定した年齢範囲も満たすことが保証されます。詳細については、Filtering Explained を参照してください。

Ctrl I