id: query.md related_key: query vectors

summary: Learn how to query vectors in Milvus.

结构化匹配

当前主题介绍如何进行向量结构化匹配。

与向量相似性搜索不同,向量结构化匹配通过基于布尔表达式 的标量过滤来检索向量。 Milvus 支持标量 field 中的多种数据类型和多种布尔表达式。布尔表达式过滤标量 field 或者 primary key field,并检索与过滤器匹配的所有结果。

下面的例子展示了如何对一个拥有 2000 行数据的数据集进行向量结构化匹配,模拟你基于书籍 ID 结构化匹配某些书籍的情况。该数据集包含 book ID (primary key)、word count (scalar field) 和 book introduction (vector field)。

加载 collection

Milvus 中的所有搜索和结构化匹配操作都在内存中执行。在执行向量结构化匹配之前将 collection 加载到内存中。

{{fragments/multiple_code.md}}

  1. from pymilvus import Collection
  2. collection = Collection("book") # Get an existing collection.
  3. collection.load()
  1. await milvusClient.collectionManager.loadCollection({
  2. collection_name: "book",
  3. });
  1. err := milvusClient.LoadCollection(
  2. context.Background(), // ctx
  3. "book", // CollectionName
  4. false // async
  5. )
  6. if err != nil {
  7. log.Fatal("failed to load collection:", err.Error())
  8. }
  1. milvusClient.loadCollection(
  2. LoadCollectionParam.newBuilder()
  3. .withCollectionName("book")
  4. .build());
  1. load -c book

向量结构化匹配

下面的示例过滤具有特定 book_id 的向量,并返回结果的 book_id field 和 book_intro field。

Milvus 支持专门为搜索或结构化匹配设置一致性级别(目前仅在 PyMilvus 上)。在创建 collection 时,搜索或结构化匹配请求中设置的一致性级别将覆盖设置的一致性级别。在本例中,搜索请求的一致性级别设置为 “Strong”,这意味着 Milvus 将在搜索或结构化匹配请求出现的确切时间点读取最新的数据视图。如果在搜索或结构化匹配期间不指定一致性级别,Milvus 将采用创建 collection 的原始一致性级别。

{{fragments/multiple_code.md}}

  1. res = collection.query(
  2. expr = "book_id in [2,4,6,8]",
  3. output_fields = ["book_id", "book_intro"],
  4. consistency_level="Strong"
  5. )
  1. const results = await milvusClient.dataManager.query({
  2. collection_name: "book",
  3. expr: "book_id in [2,4,6,8]",
  4. output_fields: ["book_id", "book_intro"],
  5. });
  1. queryResult, err := milvusClient.Query(
  2. context.Background(), // ctx
  3. "book", // CollectionName
  4. "", // PartitionName
  5. entity.NewColumnInt64("book_id", []int64{2,4,6,8}), // expr
  6. []string{"book_id", "book_intro"} // OutputFields
  7. )
  8. if err != nil {
  9. log.Fatal("fail to query collection:", err.Error())
  10. }
  1. List<String> query_output_fields = Arrays.asList("book_id", "word_count");
  2. QueryParam queryParam = QueryParam.newBuilder()
  3. .withCollectionName("book")
  4. .withExpr("book_id in [2,4,6,8]")
  5. .withOutFields(query_output_fields)
  6. .build();
  7. R<QueryResults> respQuery = milvusClient.query(queryParam);
  1. query
  2. collection_name: book
  3. The query expression: book_id in [2,4,6,8]
  4. Name of partitions that contain entities(split by "," if multiple) []:
  5. A list of fields to return(split by "," if multiple) []: book_id, book_intro
  6. timeout []:
参数 说明
expr 用于过滤属性的布尔表达式。可在布尔表达式规则中查找更多关于布尔表达式的详细信息。
output_fields (optional) 要返回的 field 名称列表。
partition_names (optional) 要查询的 partition 名称列表。
consistency_level (optional) 查询的一致性级别。
参数 说明
collection_name 要查询的 collection 的名称。
expr 用于过滤属性的布尔表达式。可在布尔表达式规则中查找更多关于布尔表达式的详细信息。
output_fields (optional) 要返回的 field 名称列表。
partition_names (optional) 要查询的 partition 名称列表。
参数 说明 选项
ctx 控制调用 API 的 Context。 N/A
CollectionName 要查询的 collection 的名称。 N/A
partitionName 要加载的 partition 的名称列表。如果为空,将查询所有 partition。 N/A
expr 用于过滤属性的布尔表达式。 有关详细信息,请参考 布尔表达式规则
OutputFields 要返回的 field 名称。 当前版本不支持 vector field。
参数 说明 选项
CollectionName 要加载的 collection 名称。 N/A
OutFields 要返回的 field 名称。 当前版本不支持 vector field 。
Expr 用于过滤属性的布尔表达式。 有关详细信息,请参考 布尔表达式规则
选项 全称 说明
—help n/a 显示使用命令的帮助。

查看返回的结果。

{{fragments/multiple_code.md}}

  1. sorted_res = sorted(res, key=lambda k: k['book_id'])
  2. sorted_res
  1. console.log(results.data)
  1. fmt.Printf("%#v\n", queryResult)
  2. for _, qr := range queryResult {
  3. fmt.Println(qr.IDs)
  4. }
  1. QueryResultsWrapper wrapperQuery = new QueryResultsWrapper(respQuery.getData());
  2. System.out.println(wrapperQuery.getFieldWrapper("book_id").getFieldData());
  3. System.out.println(wrapperQuery.getFieldWrapper("word_count").getFieldData());
  1. # Milvus CLI automatically returns the entities with the pre-defined output fields.

更多内容