执行条件查询
本主题介绍如何执行条件查询,类似SQL WHERE条件。
与向量相似性搜索不同,查询是通过基于布尔表达式的标量过滤检索向量。Milvus支持标量字段中的多种数据类型和各种布尔表达式。布尔表达式可以过滤标量字段或主键字段,并检索与过滤条件匹配的所有结果。
下面的示例展示了如何在一个包含2000行数据的数据集上执行查询,包含书籍ID(主键),字数(标量字段)和书籍介绍(向量字段)。模拟根据书籍ID查询特定书籍的情况。
加载集合
在Milvus中,所有的搜索和查询操作都在内存中执行。在进行查询之前,需要将集合加载到内存中。
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("加载集合失败:", err.Error())
}
执行查询
下面的示例根据特定的book_id
值筛选向量,并返回结果的book_id
字段和book_intro
。
Milvus支持为查询设置一致性级别。本主题的示例将一致性级别设置为Strong
。您还可以将一致性级别设置为Bounded
、Session
或Eventually
。有关Milvus中四个一致性级别的更多信息,请参见一致性。
您还可以在过滤表达式中使用动态字段,并在查询请求中输出字段。例如,请参见动态模式。
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
queryResult, err := milvusClient.Query(
context.Background(), // ctx
"book", // CollectionName
"", // PartitionName
entity.NewColumnInt64("book_id", []int64{2,4,6,8}), // expr
[]string{"book_id", "book_intro"}, // OutputFields
opt, // queryOptions
)
if err != nil {
log.Fatal("查询集合失败:", err.Error())
}
参数 | 描述 | 选项 |
---|---|---|
ctx |
用于控制API调用过程的上下文。 | N/A |
CollectionName |
要查询的集合名称。 | N/A |
partitionName |
要加载的分区的名称列表。如果为空,则将查询所有分区。 | N/A |
expr |
用于过滤属性的布尔表达式。 | 有关更多信息,请参见布尔表达式规则。 |
OutputFields |
要返回的字段名称。 | 当前版本不支持向量字段。 |
opts |
以entity.SearchQueryOptionFunc 形式表示的查询选项。 |
- Limit 表示要返回的实体数量。- Offset 表示搜索过程中要跳过的实体数量。该参数和Limit 的总和应小于16384 。- ConsistencyLevel 表示在搜索过程中应用的一致性级别。- Ignore Growing 表示在相似度搜索过程中是否忽略增长段。默认值为False ,表示搜索涉及增长段。 |
检查返回的结果。
fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
fmt.Println(qr.IDs)
}
计算实体数量
在执行查询时,您可以将count(*)
附加到output_fields
中,这样Milvus可以返回集合中的实体数量。如果要统计满足特定条件的实体数量,请使用expr
来定义一个布尔表达式。
限制
当在output_fields
中使用count(*)
时,不允许使用limit
参数。