条件查询
本主题介绍如何进行条件查询。
与向量相似性搜索不同,条件查询通过布尔表达式进行标量过滤来检索向量。Milvus支持在标量字段和各种布尔表达式上进行查询。布尔表达式可用于进行标量字段或主键字段的过滤,并检索与过滤条件匹配的所有结果。
下面的示例展示了如何对一个包含2000行数据的书籍数据集进行查询,其中包括书籍ID(主键),字数(标量字段)和书籍简介(向量字段),模拟了根据书籍ID查询特定书籍的情况。
加载集合
在进行查询之前,需要将集合加载到内存中。
from pymilvus import Collection
collection = Collection("book") # 获取一个已存在的集合。
collection.load()
进行查询
下面的示例根据特定的book_id
值筛选向量,并返回结果中的book_id
字段和book_intro
字段。
Milvus支持为查询设置一致性级别。本主题中的示例将一致性级别设置为Strong
。您也可以将一致性级别设置为Bounded
、Session
或Eventually
。有关Milvus中四种一致性级别的更多信息,请参见一致性。
您还可以在过滤表达式中使用动态字段,并在查询请求中使用输出字段。例如,请参见动态模式。
res = collection.query(
expr = "book_id in [2,4,6,8]",
offset = 0,
limit = 10,
output_fields = ["book_id", "book_intro"],
)
参数 | 描述 |
---|---|
expr |
用于筛选属性的布尔表达式。有关布尔表达式规则的更多细节,请参见布尔表达式规则。 |
limit |
要返回的最相似结果数量。该值与offset 的总和应小于16384。 |
offset |
返回集合中要跳过的结果数量。仅在指定limit 时可用,且此值与limit 的总和应小于16384。例如,如果您想要查询向量的第9和第10个最近邻居,将limit 设置为2 ,offset 设置为8 。 |
output_fields (可选) |
要返回的字段名称列表。 |
partition_names (可选) |
要查询的分区名称列表。 |
consistency_level (可选) |
查询的一致性级别。 |
检查返回的结果。
sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res
统计实体数
在进行查询时,可以在output_fields
中添加count(*)
,这样Milvus就可以返回集合中的实体数量。如果要统计满足特定条件的实体数量,请使用expr
定义一个布尔表达式。
统计集合中的所有实体数:
res = collection.query(
expr="",
output_fields = ["count(*)"],
)
print(res)
print(res[0])
统计满足特定筛选条件的实体数:
res = collection.query(
expr="book_id in [2,4,6,8]",
output_fields = ["count(*)"],
)
print(res)
print(res[0])
限制
当在output_fields
中使用count(*)
时,禁止使用limit
参数。