跳到主要内容

标量数值类型

标量数值类型用于存储 Zilliz Cloud clusters 中的非向量数值型数据。这些类型通常用于描述与向量数据相关的附加信息,例如年龄、价格等。通过使用这些数据,可以更好地描述向量,同时提高数据过滤和条件查询的效率。

标量数值类型在许多场景中非常有用。例如,在电商推荐中,可以用价格字段进行筛选;在用户画像分析中,可以用年龄段进行过滤。结合向量数据,标量数值类型数据能够帮助系统在提供相似性检索的同时,更精确地满足用户的个性化需求。

支持的标量数值类型

Zilliz Cloud clusters 支持多种标量数值类型,以满足不同的数据存储和查询需求:

数据类型

描述

BOOL

布尔类型,用于存储 truefalse,适合描述二元状态,例如是否有效、是否有库存等。

INT8

8 位整数,适用于存储小范围的整数数据。

INT16

16 位整数,适用于存储中等范围的整数数据。

INT32

32 位整数,适合一般整型数据存储,如商品数量或用户 ID。

INT64

64 位整数,适合存储较大范围的数据,例如时间戳或标识符。

FLOAT

32 位浮点数,适用于一般精度的数值数据,如评分或温度。

DOUBLE

64 位双精度浮点数,适用于需要高精度的数据,如金融数据或科学计算。

添加标量数值字段

要在 Zilliz Cloud clusters 中使用标量数值字段,需要在定义 Collection Schema 时定义相关字段,并将 datatype 设置为支持的数值类型,如 BOOLINT8。有关支持的标量数值类型列表,请参考数据类型

以下示例展示了如何定义包含标量字段 ageprice 的 Schema:

from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

schema = client.create_schema(
auto_id=False,
enable_dynamic_fields=True,
)

schema.add_field(field_name="age", datatype=DataType.INT64)
schema.add_field(field_name="price", datatype=DataType.FLOAT)
schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)
📘说明

主键字段和向量字段在创建 Collection 时是必须添加的,主键字段用于唯一标识每条数据,而向量字段是进行相似性搜索的核心。有关具体信息,请参考主键与 AutoId稀疏向量稠密向量Binary 向量

设置索引参数

为标量数值字段设置索引参数是一个可选操作,可以显著提高查询效率。

以下示例中,我们为 age 标量数值字段创建了 AUTOINDEX 索引类型,表示 Milvus 会自动根据数据类型创建合适的索引。有关更多信息,请参考 AUTOINDEX

index_params = client.prepare_index_params()

index_params.add_index(
field_name="age",
index_type="AUTOINDEX",
index_name="inverted_index"
)

在本例中,我们使用 AUTOINDEX 为标量数值字段创建索引。

# 添加向量索引
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX", # 使用自动索引方式,简化复杂的索引设置
metric_type="COSINE" # 指定相似度度量类型,可选择 L2、COSINE 或 IP
)

创建 Collection

定义好 Collection 的 Schema 和索引后,我们便可以创建包含标量字段的 Collection。

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

插入数据

Collection 创建完成后,可以插入包含标量字段的数据。

data = [
{"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},
{"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},
{"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]},
]

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

在这个例子中,我们插入了一些包含年龄(age)、价格(price)、主键(pk)以及向量表示(embedding)的数据。为了确保插入的数据与 Schema 中定义的字段匹配,建议提前检查数据类型,避免插入错误。

如果您在定义 Schema 时设置了 enable_dynamic_fields=True,Zilliz Cloud clusters 允许您插入未提前定义的标量字段,但应注意这可能增加查询和管理的复杂性,影响性能。有关更多信息,请参考 Dynamic Field

使用标量字段进行搜索和查询

添加标量字段后,您可以在搜索(Search)和查询(Query)中利用这些字段进行过滤,从而实现更精确的搜索结果。

过滤查询

添加标量字段后,您可以在 Query 中利用这些字段进行过滤。例如,您可以查询 age 在 30 到 40 之间的所有数据:

filter = "30 <= age <= 40"

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

print(res)

# Output
# data: ["{'age': 30, 'price': np.float32(149.5), 'pk': 2}", "{'age': 35, 'price': np.float32(199.99), 'pk': 3}"]

此查询表达式将返回所有符合条件的数据,并输出其 ageprice 字段。有关过滤查询的更多信息,请参考 Query基本操作符

向量搜索与标量过滤结合

除了基本的标量字段过滤,您还可以将向量相似度搜索与标量字段过滤结合使用。例如,以下代码展示了如何在向量搜索中添加标量字段的过滤条件:

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)

# Output
# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]"]

在这个例子中,我们首先定义了查询向量,并在搜索时添加了过滤条件 25 <= age <= 35,这样可以确保搜索结果不仅与查询向量相似,还符合年龄范围的限制。有关更多信息,请参考 Filtered Search基本操作符