Skip to main content
Version: User Guides (Cloud)

Number Field

A number field is a scalar field that stores numeric values. These values can be whole numbers (integers) or decimal numbers (floating-point numbers). They are typically used to represent quantities, measurements, or any data that needs to be mathematically processed.

The table below describes the data types of number fields available in Zilliz Cloud clusters.

Field Type

Description

BOOL

Boolean type for storing true or false, suitable for describing binary states.

INT8

8-bit integer, suitable for storing small-range integer data.

INT16

16-bit integer, for medium-range integer data.

INT32

32-bit integer, ideal for general integer data storage like product quantities or user IDs.

INT64

64-bit integer, suitable for storing large-range data like timestamps or identifiers.

FLOAT

32-bit floating-point number, for data requiring general precision, such as ratings or temperature.

DOUBLE

64-bit double-precision floating-point number, for high-precision data like financial information or scientific calculations.

To declare a number field, simply set the datatype to one of the available numeric data types. For example, DataType.INT64 for an integer field or DataType.FLOAT for a floating-point field.

📘Notes

Zilliz Cloud supports null values and default values for number fields. To enable these features, set nullable to True and default_value to a numeric value. For details, refer to Nullable & Default.

Add number field

To store numeric data, define a number field in your collection schema. Below is an example of a collection schema with two number fields:

  • age: stores integer data, allows null values, and has a default value of 18.

  • price: stores float data, allows null values, but does not have a default value.

📘Notes

If you set enable_dynamic_fields=True when defining the schema, Zilliz Cloud allows you to insert scalar fields that were not defined in advance. However, this may increase the complexity of queries and management, potentially impacting performance. For more information, refer to Dynamic Field.

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

Set index params

Indexing helps improve search and query performance. In Zilliz Cloud clusters, indexing is mandatory for vector fields but optional for scalar fields.

The following example creates indexes on the vector field embedding and the scalar field age, both using the AUTOINDEX index type. With this type, Milvus automatically selects the most suitable index based on the data type.

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

Create collection

Once the schema and indexes are defined, create a collection that includes number fields.

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

Insert data

After creating the collection, insert entities that match the schema.

# 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_scalar_collection",
data=data
)

Query with filter expressions

After inserting entities, use the query method to retrieve entities that match the specified filter expressions.

To retrieve entities where the age is greater than 30:

filter = 'age > 30'

res = client.query(
collection_name="my_scalar_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}"
# ]

To retrieve entities where the price is null:

filter = 'price is null'

res = client.query(
collection_name="my_scalar_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}"
# ]

To retrieve entities where age has the value 18, use the following expression below. As the default value of age is 18, the expected result should include entities with age explicitly set to 18 or with age set to null.

filter = 'age == 18'

res = client.query(
collection_name="my_scalar_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}"
# ]

Vector search with filter expressions

In addition to basic number field filtering, you can combine vector similarity searches with number field filters. For example, the following code shows how to add a number field filter to a vector search:

filter = "25 <= age <= 35"

res = client.search(
collection_name="my_scalar_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}}]"
# ]

In this example, we first define a query vector and add a filter condition 25 <= age <= 35 during the search. This ensures that the search results are not only similar to the query vector but also meet the specified age range. For more information, refer to Filtering.