Query
In addition to ANN searches, Zilliz Cloud also supports metadata filtering through queries. This page introduces how to use Query, Get, and QueryIterators to perform metadata filtering.
If you add new fields after the collection has been created, queries that include these fields return the defined default values or NULL for entities that have not explicitly set values. For details, refer to Alter Collection Schema.
Overview
A Collection can store various types of scalar fields. You can have Zilliz Cloud filter Entities based on one or more scalar fields. Zilliz Cloud offers three types of queries: Query, Get, and QueryIterator. The table below compares these three query types.
Get | Query | QueryIterator | |
|---|---|---|---|
Applicable scenarios | To find entities that hold the specified primary keys. | To find all or a specified number of entities that meet the custom filtering conditions | To find all entities that meet the custom filtering conditions in paginated queries. |
Filtering method | By primary keys | By filtering expressions. | By filtering expressions. |
Mandatory parameters |
|
|
|
Optional parameters |
|
|
|
Returns | Returns entities that hold the specified primary keys in the specified collection or partition. | Returns all or a specified number of entities that meet the custom filtering conditions in the specified collection or partition. | Returns all entities that meet the custom filtering conditions in the specified collection or partition through paginated queries. |
For more on metadata filtering, refer to Filtering ExplainedFiltering Explained.
Use Get
When you need to find entities by their primary keys, you can use the Get method. The following code examples assume that there are three fields named id, vector, and color in your collection.
[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},
]
You can get entities by their IDs as follows.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
from pymilvus import MilvusClient
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)
res = client.get(
collection_name="my_collection",
ids=[0, 1, 2],
output_fields=["vector", "color"]
)
print(res)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.GetReq;
import io.milvus.v2.service.vector.response.GetResp;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.*;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
GetReq getReq = GetReq.builder()
.collectionName("my_collection")
.ids(Arrays.asList(0, 1, 2))
.outputFields(Arrays.asList("vector", "color"))
.build();
GetResp getResp = client.get(getReq);
List<QueryResp.QueryResult> results = getResp.getGetResults();
for (QueryResp.QueryResult result : results) {
System.out.println(result.getEntity());
}
// Output
// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}
// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}
// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/column"
"github.com/milvus-io/milvus/client/v3/entity"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
milvusAddr := "YOUR_CLUSTER_ENDPOINT"
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: milvusAddr,
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
defer client.Close(ctx)
resultSet, err := client.Get(ctx, milvusclient.NewQueryOption("my_collection").
WithConsistencyLevel(entity.ClStrong).
WithIDs(column.NewColumnInt64("id", []int64{0, 1, 2})).
WithOutputFields("vector", "color"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("vector: ", resultSet.GetColumn("vector").FieldData().GetVectors())
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
use milvus::v2::prelude::*;
let client = ClientV2::new(
&ConnectConfig::new()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN"),
)
.await?;
let res = client.get(
GetRequest::builder()
.collection_name("my_collection")
.ids(Ids::Int64(vec![0, 1, 2]))
.output_fields(["vector", "color"])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
std::vector<int64_t> ids = {0, 1, 2};
auto request = milvus::GetRequest()
.WithCollectionName("my_collection")
.WithIDs(std::move(ids))
.AddOutputField("color")
.AddOutputField("vector");
milvus::GetResponse response;
status = client->Get(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
const res = await client.get({
collection_name: "my_collection",
ids: [0,1,2],
output_fields: ["vector", "color"]
})
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"id": [0, 1, 2],
"outputFields": ["vector", "color"]
}'
# {"code":0,"cost":0,"data":[{"color":"pink_8682","id":0,"vector":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"orange_6781","id":2,"vector":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}
# Zilliz CLI
Use Query
Basic Query
When you need to find entities by custom filtering conditions, use the Query method. The following code examples assume there are three fields named id, vector, and color and return the specified number of entities that hold a color value starting with red.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
from pymilvus import MilvusClient
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)
res = client.query(
collection_name="my_collection",
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.*;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("color like \"red%\"")
.outputFields(Arrays.asList("vector", "color"))
.limit(3)
.build();
QueryResp queryResp = client.query(queryReq);
List<QueryResp.QueryResult> results = queryResp.getQueryResults();
for (QueryResp.QueryResult result : results) {
System.out.println(result.getEntity());
}
// Output
// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}
// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}
// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}
import (
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("color like \"red%\"").
WithOutputFields("vector", "color").
WithLimit(3))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("vector: ", resultSet.GetColumn("vector").FieldData().GetVectors())
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
use milvus::v2::prelude::*;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("color like \"red%\"")
.output_fields(["vector", "color"])
.limit(3)
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter(R"(color like "red%")")
.WithLimit(3)
.AddOutputField("vector")
.AddOutputField("color");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
const res = await client.query({
collection_name: "my_collection",
filter: 'color like "red%"',
output_fields: ["vector", "color"],
limit: 3
})
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "color like \"red%\"",
"limit": 3,
"outputFields": ["vector", "color"]
}'
#{"code":0,"cost":0,"data":[{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"red_4794","id":4,"vector":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{"color":"red_9392","id":6,"vector":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}
# Zilliz CLI
Sort Query Results
By default, Query returns results in an unspecified order. Use the order_by parameter to sort results by one or more scalar fields. When using order_by, note that:
-
order_bymust be used together withlimit. -
Supported field types:
INT8,INT16,INT32,INT64,FLOAT,DOUBLE, andVARCHAR. Sorting by vector,JSON, orARRAYfields is not supported. -
When sorting by a nullable field, NULL values are placed at the end for ascending order (NULLS LAST) and at the beginning for descending order (NULLS FIRST).
Basic Sort
Pass a list of "field_name:direction" strings to the order_by parameter, where direction is either asc (ascending) or desc (descending). Note that asc and desc are case-sensitive.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
from pymilvus import MilvusClient
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)
# Sort results by id in ascending order
res = client.query(
collection_name="my_collection",
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3,
order_by=["id:asc"],
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("order_by_fields", "id:asc");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("color like \"red%\"")
.outputFields(Arrays.asList("vector", "color"))
.limit(3)
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("color like \"red%\"").
WithOutputFields("vector", "color").
WithLimit(3).
WithOrderByFields("id:asc"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("vector: ", resultSet.GetColumn("vector").FieldData().GetVectors())
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
use milvus::v2::prelude::*;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("color like \"red%\"")
.output_fields(["vector", "color"])
.limit(3)
.order_by_fields([OrderByField::new().field_name("id").direction(AggDirection::Asc)])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter(R"(color like "red%")")
.WithLimit(3)
.AddOutputField("vector")
.AddOutputField("color")
.AddOrderByField(milvus::OrderByField("id", milvus::AggregationDirection::ASC));
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({ address, token });
const res = await client.query({
collection_name: "my_collection",
filter: 'color like "red%"',
output_fields: ["vector", "color"],
limit: 3,
order_by: ["id:asc"],
});
console.log(res.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "color like \"red%\"",
"limit": 3,
"outputFields": ["vector", "color"],
"orderByFields": ["id:asc"]
}'
# Zilliz CLI
Multi-field Sort
You can sort by multiple fields at once. Results are first ordered by the first field in the list. When two rows have the same value in that field, the second field determines their order, and so on.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
# Sort by rating descending, then by price ascending for ties
res = client.query(
collection_name="my_collection",
filter="",
output_fields=["color", "rating", "price"],
limit=10,
order_by=["rating:desc", "price:asc"],
)
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("order_by_fields", "rating:desc,price:asc");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("")
.outputFields(Arrays.asList("color", "rating", "price"))
.limit(10)
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("").
WithOutputFields("color", "rating", "price").
WithLimit(10).
WithOrderByFields("rating:desc", "price:asc"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
use milvus::v2::prelude::*;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("")
.output_fields(["color", "rating", "price"])
.limit(10)
.order_by_fields([
OrderByField::new().field_name("rating").direction(AggDirection::Desc),
OrderByField::new().field_name("price").direction(AggDirection::Asc),
])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("")
.WithLimit(10)
.AddOutputField("color")
.AddOutputField("rating")
.AddOutputField("price")
.AddOrderByField(milvus::OrderByField("rating", milvus::AggregationDirection::DESC))
.AddOrderByField(milvus::OrderByField("price", milvus::AggregationDirection::ASC));
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
const res = await client.query({
collection_name: "my_collection",
filter: "",
output_fields: ["color", "rating", "price"],
limit: 10,
order_by: ["rating:desc", "price:asc"],
});
console.log(res.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "",
"limit": 10,
"outputFields": ["color", "rating", "price"],
"orderByFields": ["rating:desc,price:asc"]
}'
# Zilliz CLI
Pagination with Sort
Use order_by together with limit and offset to paginate through sorted results. For example, to display a product list sorted by price across multiple pages, each page shows the next batch of items in the correct price order without duplicates or gaps.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
# Page 1
page1 = client.query(
collection_name="my_collection",
filter="color like \"red%\"",
output_fields=["color", "price"],
limit=5,
offset=0,
order_by=["price:asc"],
)
# Page 2
page2 = client.query(
collection_name="my_collection",
filter="color like \"red%\"",
output_fields=["color", "price"],
limit=5,
offset=5,
order_by=["price:asc"],
)
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("order_by_fields", "price:asc");
QueryReq page1Req = QueryReq.builder()
.collectionName("my_collection")
.filter("color like \"red%\"")
.outputFields(Arrays.asList("color", "price"))
.limit(5)
.offset(0)
.queryParams(queryParams)
.build();
QueryResp page1 = client.query(page1Req);
for (QueryResp.QueryResult result : page1.getQueryResults()) {
System.out.println(result.getEntity());
}
QueryReq page2Req = QueryReq.builder()
.collectionName("my_collection")
.filter("color like \"red%\"")
.outputFields(Arrays.asList("color", "price"))
.limit(5)
.offset(5)
.queryParams(queryParams)
.build();
QueryResp page2 = client.query(page2Req);
for (QueryResp.QueryResult result : page2.getQueryResults()) {
System.out.println(result.getEntity());
}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
page1, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("color like \"red%\"").
WithOutputFields("color", "price").
WithLimit(5).
WithOffset(0).
WithOrderByFields("price:asc"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
page2, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("color like \"red%\"").
WithOutputFields("color", "price").
WithLimit(5).
WithOffset(5).
WithOrderByFields("price:asc"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("page1: ", page1.GetColumn("color").FieldData().GetScalars())
fmt.Println("page2: ", page2.GetColumn("color").FieldData().GetScalars())
use milvus::v2::prelude::*;
let page1 = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("color like \"red%\"")
.output_fields(["color", "price"])
.limit(5)
.offset(0)
.order_by_fields([OrderByField::new().field_name("price").direction(AggDirection::Asc)])
.build()?,
)
.await?;
let page2 = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("color like \"red%\"")
.output_fields(["color", "price"])
.limit(5)
.offset(5)
.order_by_fields([OrderByField::new().field_name("price").direction(AggDirection::Asc)])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto page1Req = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter(R"(color like "red%")")
.WithLimit(5)
.WithOffset(0)
.AddOutputField("color")
.AddOutputField("price")
.AddOrderByField(milvus::OrderByField("price", milvus::AggregationDirection::ASC));
milvus::QueryResponse page1;
status = client->Query(page1Req, page1);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto page2Req = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter(R"(color like "red%")")
.WithLimit(5)
.WithOffset(5)
.AddOutputField("color")
.AddOutputField("price")
.AddOrderByField(milvus::OrderByField("price", milvus::AggregationDirection::ASC));
milvus::QueryResponse page2;
status = client->Query(page2Req, page2);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
const page1 = await client.query({
collection_name: "my_collection",
filter: 'color like "red%"',
output_fields: ["color", "price"],
limit: 5,
offset: 0,
order_by: ["price:asc"],
});
console.log(page1.data);
const page2 = await client.query({
collection_name: "my_collection",
filter: 'color like "red%"',
output_fields: ["color", "price"],
limit: 5,
offset: 5,
order_by: ["price:asc"],
});
console.log(page2.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "color like \"red%\"",
"limit": 5,
"offset": 0,
"outputFields": ["color", "price"],
"orderByFields": ["price:asc"]
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "color like \"red%\"",
"limit": 5,
"offset": 5,
"outputFields": ["color", "price"],
"orderByFields": ["price:asc"]
}'
# Zilliz CLI
Aggregate Query Results
You can group query results by one or more scalar fields and compute aggregations per group. The supported aggregation operators are count, min, max, sum, and avg.
When using group_by_fields, note that:
-
Supported field types for
group_by_fields:INT8,INT16,INT32,INT64,VARCHAR, andTIMESTAMPTZ. Grouping byFLOAT,DOUBLE, vector,JSON, orARRAYfields returns an error. -
sumandavgare numeric only — applying them to aVARCHARfield returns an error.
To enable aggregation, pass group_by_fields to query() and add aggregation expressions (count(*), count(<field>), min(<field>), max(<field>), sum(<field>), avg(<field>)) to output_fields.
The following example groups entities by the color field and returns the number of entities in each color group:
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
from pymilvus import MilvusClient
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)
res = client.query(
collection_name="my_collection",
filter="",
group_by_fields=["color"],
output_fields=["color", "count(*)"],
)
# [{'color': 'red', 'count(*)': 10},
# {'color': 'orange', 'count(*)': 10},
# {'color': 'yellow', 'count(*)': 10},
# {'color': 'green', 'count(*)': 10},
# {'color': 'blue', 'count(*)': 10}]
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("group_by_fields", "color");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("")
.outputFields(Arrays.asList("color", "count(*)"))
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
// Output
// {color=red, count(*)=10}
// {color=orange, count(*)=10}
// {color=yellow, count(*)=10}
// {color=green, count(*)=10}
// {color=blue, count(*)=10}
// Note: Query-level group-by aggregation is not supported in milvus-sdk-go as of client/v3.0.0.
// Use client.Search(...) with WithGroupByField(...) instead.
use milvus::v2::prelude::*;
use std::collections::HashMap;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("")
.extra_params(HashMap::from([
("group_by_fields".to_string(), "color".to_string()),
]))
.output_fields(["color", "count(*)"])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("")
.AddOutputField("color")
.AddOutputField("count(*)")
.AddExtraParam("group_by_fields", "color");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
const res = await client.query({
collection_name: "my_collection",
filter: "",
output_fields: ["color", "count(*)"],
group_by_fields: ["color"]
});
console.log(res.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "",
"limit": 5,
"outputFields": ["color", "avg(price)", "count(*)"],
"groupByFields": ["color"]
}'
# Zilliz CLI
You can request several aggregation expressions in a single call. The following example groups by color and returns the row count, average price, and maximum rating for each group:
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
res = client.query(
collection_name="my_collection",
filter="",
group_by_fields=["color"],
output_fields=["color", "count(*)", "avg(price)", "max(rating)"],
)
# [{'color': 'red', 'count(*)': 10, 'avg(price)': 65.22, 'max(rating)': 5},
# {'color': 'orange', 'count(*)': 10, 'avg(price)': 48.67, 'max(rating)': 5},
# {'color': 'yellow', 'count(*)': 10, 'avg(price)': 64.15, 'max(rating)': 3},
# {'color': 'green', 'count(*)': 10, 'avg(price)': 58.28, 'max(rating)': 5},
# {'color': 'blue', 'count(*)': 10, 'avg(price)': 50.20, 'max(rating)': 5}]
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("group_by_fields", "color");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("")
.outputFields(Arrays.asList("color", "count(*)", "avg(price)", "max(rating)"))
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
// Output
// {color=red, count(*)=10, avg(price)=65.22, max(rating)=5}
// {color=orange, count(*)=10, avg(price)=48.67, max(rating)=5}
// {color=yellow, count(*)=10, avg(price)=64.15, max(rating)=3}
// {color=green, count(*)=10, avg(price)=58.28, max(rating)=5}
// {color=blue, count(*)=10, avg(price)=50.20, max(rating)=5}
// Note: Query-level group-by aggregation is not supported in milvus-sdk-go as of client/v3.0.0.
// Use client.Search(...) with WithGroupByField(...) instead.
use milvus::v2::prelude::*;
use std::collections::HashMap;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("")
.extra_params(HashMap::from([
("group_by_fields".to_string(), "color".to_string()),
]))
.output_fields(["color", "count(*)", "avg(price)", "max(rating)"])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("")
.AddOutputField("color")
.AddOutputField("count(*)")
.AddOutputField("avg(price)")
.AddOutputField("max(rating)")
.AddExtraParam("group_by_fields", "color");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
const res = await client.query({
collection_name: "my_collection",
filter: "",
output_fields: ["color", "count(*)", "avg(price)", "max(rating)"],
group_by_fields: ["color"]
});
console.log(res.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "",
"limit": 5,
"outputFields": ["color", "avg(price)", "count(*)"],
"groupByFields": ["color"]
}'
# Zilliz CLI
Pass more than one field to group_by_fields to compute composite groups. The following example groups by (color, rating) and computes the price range in each bucket:
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
res = client.query(
collection_name="my_collection",
filter="",
group_by_fields=["color", "rating"],
output_fields=["color", "rating", "min(price)", "max(price)"],
)
# [{'color': 'red', 'rating': 5, 'min(price)': 34.51, 'max(price)': 70.90},
# {'color': 'orange', 'rating': 2, 'min(price)': 12.39, 'max(price)': 81.99},
# {'color': 'yellow', 'rating': 2, 'min(price)': 22.62, 'max(price)': 88.24},
# {'color': 'green', 'rating': 1, 'min(price)': 18.35, 'max(price)': 59.53},
# {'color': 'blue', 'rating': 4, 'min(price)': 21.23, 'max(price)': 82.45},
# ...]
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("group_by_fields", "color,rating");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("")
.outputFields(Arrays.asList("color", "rating", "min(price)", "max(price)"))
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
// Output
// {color=red, rating=5, min(price)=34.51, max(price)=70.90}
// {color=orange, rating=2, min(price)=12.39, max(price)=81.99}
// {color=yellow, rating=2, min(price)=22.62, max(price)=88.24}
// {color=green, rating=1, min(price)=18.35, max(price)=59.53}
// {color=blue, rating=4, min(price)=21.23, max(price)=82.45}
// ...
// Note: Query-level group-by aggregation is not supported in milvus-sdk-go as of client/v3.0.0.
// Use client.Search(...) with WithGroupByField(...) instead.
use milvus::v2::prelude::*;
use std::collections::HashMap;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("")
.extra_params(HashMap::from([
("group_by_fields".to_string(), "color,rating".to_string()),
]))
.output_fields(["color", "rating", "min(price)", "max(price)"])
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("")
.AddOutputField("color")
.AddOutputField("rating")
.AddOutputField("min(price)")
.AddOutputField("max(price)")
.AddExtraParam("group_by_fields", "color,rating");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
const res = await client.query({
collection_name: "my_collection",
filter: "",
output_fields: ["color", "rating", "min(price)", "max(price)"],
group_by_fields: ["color", "rating"]
});
console.log(res.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "",
"limit": 5,
"outputFields": ["color", "avg(price)", "count(*)"],
"groupByFields": ["color"]
}'
# Zilliz CLI
You can also combine group_by_fields with limit to cap how many groups come back — useful when a field has high cardinality and you only need a sample of buckets:
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
res = client.query(
collection_name="my_collection",
filter="",
group_by_fields=["color"],
output_fields=["color", "avg(price)", "count(*)"],
limit=5,
)
# [{'color': 'red', 'avg(price)': 65.22, 'count(*)': 10},
# {'color': 'orange', 'avg(price)': 48.67, 'count(*)': 10},
# {'color': 'yellow', 'avg(price)': 64.15, 'count(*)': 10},
# {'color': 'green', 'avg(price)': 58.28, 'count(*)': 10},
# {'color': 'blue', 'avg(price)': 50.20, 'count(*)': 10}]
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("group_by_fields", "color");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("")
.outputFields(Arrays.asList("color", "avg(price)", "count(*)"))
.limit(5)
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
// Output
// {color=red, avg(price)=65.22, count(*)=10}
// {color=orange, avg(price)=48.67, count(*)=10}
// {color=yellow, avg(price)=64.15, count(*)=10}
// {color=green, avg(price)=58.28, count(*)=10}
// {color=blue, avg(price)=50.20, count(*)=10}
// Note: Query-level group-by aggregation is not supported in milvus-sdk-go as of client/v3.0.0.
// Use client.Search(...) with WithGroupByField(...) instead.
use milvus::v2::prelude::*;
use std::collections::HashMap;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("")
.extra_params(HashMap::from([
("group_by_fields".to_string(), "color".to_string()),
]))
.output_fields(["color", "avg(price)", "count(*)"])
.limit(5)
.build()?,
)
.await?;
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("")
.WithLimit(5)
.AddOutputField("color")
.AddOutputField("avg(price)")
.AddOutputField("count(*)")
.AddExtraParam("group_by_fields", "color");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
const res = await client.query({
collection_name: "my_collection",
filter: "",
output_fields: ["color", "avg(price)", "count(*)"],
limit: 5,
group_by_fields: ["color"]
});
console.log(res.data);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "",
"limit": 5,
"outputFields": ["color", "avg(price)", "count(*)"],
"groupByFields": ["color"]
}'
# Zilliz CLI
Use QueryIterator
When you need to find entities by custom filtering conditions through paginated queries, create a QueryIterator and use its next() method to iterate over all entities to find those meeting the filtering conditions. The following code examples assume that there are three fields named id, vector, and color and return all entities that hold a color value starting with red.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
iterator = client.query_iterator(
"my_collection",
batch_size=10,
filter="color like \"red%\"",
output_fields=["color"]
)
results = []
while True:
result = iterator.next()
if not result:
iterator.close()
break
print(result)
results += result
import io.milvus.orm.iterator.QueryIterator;
import io.milvus.response.QueryResultsWrapper;
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.service.vector.request.QueryIteratorReq;
import java.util.*;
QueryIteratorReq req = QueryIteratorReq.builder()
.collectionName("my_collection")
.expr("color like \"red%\"")
.batchSize(10L)
.outputFields(Collections.singletonList("color"))
.build();
QueryIterator queryIterator = client.queryIterator(req);
while (true) {
List<QueryResultsWrapper.RowRecord> res = queryIterator.next();
if (res.isEmpty()) {
queryIterator.close();
break;
}
for (QueryResultsWrapper.RowRecord record : res) {
System.out.println(record);
}
}
// Output
// [color:red_7025, id:1]
// [color:red_4794, id:4]
// [color:red_9392, id:6]
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
iterator, err := client.QueryIterator(ctx, milvusclient.NewQueryIteratorOption("my_collection").
WithFilter("color like \"red%\"").
WithBatchSize(10).
WithOutputFields("color"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
for {
resultSet, err := iterator.Next(ctx)
if err != nil {
fmt.Println(err.Error())
break
}
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
}
use milvus::v2::prelude::*;
let mut iterator = client.query_iterator(
QueryIteratorRequest::builder()
.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("color like \"red%\"")
.output_fields(["color"])
.build()?,
)
.batch_size(10)
.build()?,
)
.await?;
while let Some(result) = iterator.next().await? {
println!("{:?}", result);
}
milvus::QueryIteratorRequest request;
request.SetCollectionName("my_collection");
request.SetBatchSize(10);
request.SetFilter(R"(color like "red%")");
request.AddOutputField("color");
milvus::QueryIteratorPtr iterator;
auto status = client->QueryIterator(request, iterator);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
while (true) {
milvus::QueryResults batch_results;
status = iterator->Next(batch_results);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
break;
}
milvus::EntityRows rows;
status = batch_results.OutputRows(rows);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
break;
}
for (const auto& row : rows) {
std::cout << row.dump() << std::endl;
}
}
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const iterator = await client.queryIterator({
collection_name: 'my_collection',
batchSize: 10,
expr: 'color like "red%"',
output_fields: ['color'],
});
const results = [];
let page = 0;
for await (const value of iterator) {
results.push(...value);
page += 1;
}
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
# QueryIterator is not yet available in RESTful API.
# Use repeated query calls with offset for pagination.
# Zilliz CLI
Queries in Partitions
You can also perform queries within one or multiple partitions by including the partition names in the Get, Query, or QueryIterator request. The following code examples assume that there is a partition named PartitionA in the collection.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
res = client.get(
collection_name="my_collection",
partition_names=["partitionA"],
ids=[10, 11, 12],
output_fields=["vector", "color"]
)
res = client.query(
collection_name="my_collection",
partition_names=["partitionA"],
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3
)
# Use QueryIterator
iterator = client.query_iterator(
"my_collection",
partition_names=["partitionA"],
batch_size=10,
filter="color like \"red%\"",
output_fields=["color"]
)
results = []
while True:
result = iterator.next()
if not result:
iterator.close()
break
print(result)
results += result
import io.milvus.orm.iterator.QueryIterator;
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.service.vector.request.GetReq;
import io.milvus.v2.service.vector.request.QueryIteratorReq;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.GetResp;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.Collections;
GetReq getReq = GetReq.builder()
.collectionName("my_collection")
.partitionName("partitionA")
.ids(Arrays.asList(10, 11, 12))
.outputFields(Collections.singletonList("color"))
.build();
GetResp getResp = client.get(getReq);
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.partitionNames(Collections.singletonList("partitionA"))
.filter("color like \"red%\"")
.outputFields(Collections.singletonList("color"))
.limit(3)
.build();
QueryResp queryResp = client.query(queryReq);
QueryIteratorReq req = QueryIteratorReq.builder()
.collectionName("my_collection")
.partitionNames(Collections.singletonList("partitionA"))
.expr("color like \"red%\"")
.batchSize(50L)
.outputFields(Collections.singletonList("color"))
.consistencyLevel(ConsistencyLevel.BOUNDED)
.build();
QueryIterator queryIterator = client.queryIterator(req);
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/column"
"github.com/milvus-io/milvus/client/v3/entity"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Get(ctx, milvusclient.NewQueryOption("my_collection").
WithPartitions("partitionA").
WithIDs(column.NewColumnInt64("id", []int64{10, 11, 12})).
WithOutputFields("vector", "color"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("vector: ", resultSet.GetColumn("vector").FieldData().GetVectors())
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
resultSet, err = client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithPartitions("partitionA").
WithFilter("color like \"red%\"").
WithOutputFields("vector", "color"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("vector: ", resultSet.GetColumn("vector").FieldData().GetVectors())
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
use milvus::v2::prelude::*;
let res = client.get(
GetRequest::builder()
.collection_name("my_collection")
.partition_names(["partitionA"])
.ids(Ids::Int64(vec![10, 11, 12]))
.output_fields(["vector", "color"])
.build()?,
)
.await?;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.partition_names(["partitionA"])
.filter("color like \"red%\"")
.output_fields(["vector", "color"])
.limit(3)
.build()?,
)
.await?;
let mut iterator = client.query_iterator(
QueryIteratorRequest::builder()
.query(
QueryRequest::builder()
.collection_name("my_collection")
.partition_names(["partitionA"])
.filter("color like \"red%\"")
.output_fields(["color"])
.build()?,
)
.batch_size(10)
.build()?,
)
.await?;
while let Some(result) = iterator.next().await? {
println!("{:?}", result);
}
// Use get
{
std::vector<int64_t> ids = {10, 11, 12};
auto request = milvus::GetRequest()
.WithCollectionName("my_collection")
.AddPartitionName("partitionA")
.WithIDs(std::move(ids))
.AddOutputField("color")
.AddOutputField("vector");
milvus::GetResponse response;
status = client->Get(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
}
// Use query
{
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.AddPartitionName("partitionA")
.WithFilter(R"(color like "red%")")
.WithLimit(3)
.AddOutputField("vector")
.AddOutputField("color");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
}
// Use queryiterator
{
milvus::QueryIteratorRequest request;
request.SetCollectionName("my_collection");
request.AddPartitionName("partitionA");
request.SetBatchSize(10);
request.SetFilter(R"(color like "red%")");
request.AddOutputField("color");
milvus::QueryIteratorPtr iterator;
auto status = client->QueryIterator(request, iterator);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
while (true) {
milvus::QueryResults batch_results;
status = iterator->Next(batch_results);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
break;
}
milvus::EntityRows rows;
status = batch_results.OutputRows(rows);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
break;
}
for (const auto& row : rows) {
std::cout << row.dump() << std::endl;
}
}
}
// Use get
var res = await client.get({
collection_name: "my_collection",
partition_names: ["partitionA"],
ids: [10,11,12],
output_fields: ["vector", "color"]
})
// Use query
res = await client.query({
collection_name: "my_collection",
partition_names: ["partitionA"],
filter: 'color like "red%"',
output_fields: ["vector", "color"],
limit: 3
})
// Use queryiterator
const iterator = await client.queryIterator({
collection_name: 'my_collection',
partition_names: ['partitionA'],
batchSize: 10,
expr: 'color like "red%"',
output_fields: ['vector', 'color'],
});
const results = [];
let page = 0;
for await (const value of iterator) {
results.push(...value);
page += 1;
}
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
# Use get
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"partitionNames": ["partitionA"],
"id": [10, 11, 12],
"outputFields": ["vector", "color"]
}'
# Use query
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"partitionNames": ["partitionA"],
"filter": "color like \"red%\"",
"limit": 3,
"outputFields": ["vector", "color"]
}'
# Zilliz CLI
Random Sampling with Query
To extract a representative subset of data from your collection for data exploration or development testing, use the RANDOM_SAMPLE(sampling_factor) expression, where the sampling_factor is a float between 0 and 1 representing the percentage of data to sample.
For detailed usage, advanced examples, and best practices, refer to Random Sampling.
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
# Sample 1% of the entire collection
res = client.query(
collection_name="my_collection",
filter="RANDOM_SAMPLE(0.01)",
output_fields=["vector", "color"]
)
print(f"Sampled {len(res)} entities from collection")
# Combine with other filters - first filter, then sample
res = client.query(
collection_name="my_collection",
filter="color like \"red%\" AND RANDOM_SAMPLE(0.005)",
output_fields=["vector", "color"],
limit=10
)
print(f"Found {len(res)} red items in sample")
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.*;
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("RANDOM_SAMPLE(0.01)")
.outputFields(Arrays.asList("vector", "color"))
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("color like \"red%\" AND RANDOM_SAMPLE(0.005)")
.outputFields(Arrays.asList("vector", "color"))
.limit(10)
.build();
queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/column"
"github.com/milvus-io/milvus/client/v3/entity"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("RANDOM_SAMPLE(0.01)").
WithOutputFields("vector", "color"))
if err != nil {
return err
}
resultSet, err = client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("color like \"red%\" AND RANDOM_SAMPLE(0.005)").
WithLimit(10).
WithOutputFields("vector", "color"))
if err != nil {
return err
}
use milvus::v2::prelude::*;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("RANDOM_SAMPLE(0.01)")
.output_fields(["vector", "color"])
.build()?,
)
.await?;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("color like \"red%\" AND RANDOM_SAMPLE(0.005)")
.output_fields(["vector", "color"])
.limit(10)
.build()?,
)
.await?;
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("RANDOM_SAMPLE(0.01)")
.AddOutputField("vector")
.AddOutputField("color");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
request.SetFilter(R"(color like "red%" AND RANDOM_SAMPLE(0.005))");
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
// Sample 1% of the entire collection
let res = await client.query({
collection_name: "my_collection",
filter: "RANDOM_SAMPLE(0.01)",
output_fields: ["vector", "color"]
});
console.log(`Sampled ${res.data.length} entities from collection`);
// Combine with other filters - first filter, then sample
res = await client.query({
collection_name: "my_collection",
filter: 'color like "red%" AND RANDOM_SAMPLE(0.005)',
output_fields: ["vector", "color"],
limit: 10
});
console.log(`Found ${res.data.length} red items in sample`);
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "RANDOM_SAMPLE(0.01)",
"outputFields": ["vector", "color"]
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"filter": "color like \"red%\" AND RANDOM_SAMPLE(0.005)",
"limit": 10,
"outputFields": ["vector", "color"]
}'
# Zilliz CLI
Temporarily Set a Timezone for a Query
If your collection has a TIMESTAMPTZ field, you can temporarily override the database or collection default timezone for a single operation by setting the timezone parameter in the query call. This controls how TIMESTAMPTZ values are displayed and compared during the operation.
The value of timezone must be a valid IANA time zone identifier (for example, Asia/Shanghai, America/Chicago, or UTC). For details on how to use a TIMESTAMPTZ field, refer to TIMESTAMPTZ Field.
The example below shows how to temporarily set a timezone for a query operation:
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
# Query data and display the tsz field converted to "America/Havana"
results = client.query(
"my_collection",
filter="id <= 10",
output_fields=["id", "tsz", "vec"],
limit=2,
timezone="America/Havana",
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
Map<String, Object> queryParams = new HashMap<>();
queryParams.put("timezone", "America/Havana");
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("id <= 10")
.outputFields(Arrays.asList("id", "tsz", "vec"))
.limit(2)
.queryParams(queryParams)
.build();
QueryResp queryResp = client.query(queryReq);
for (QueryResp.QueryResult result : queryResp.getQueryResults()) {
System.out.println(result.getEntity());
}
// Note: The timezone query parameter is not supported in milvus-sdk-go as of client/v3.0.0.
use milvus::v2::prelude::*;
let res = client.query(
QueryRequest::builder()
.collection_name("my_collection")
.filter("id <= 10")
.output_fields(["id", "tsz", "vec"])
.limit(2)
.timezone("America/Havana")
.build()?,
)
.await?;
auto request = milvus::QueryRequest()
.WithCollectionName("my_collection")
.WithFilter("id <= 10")
.WithLimit(2)
.AddOutputField("id")
.AddOutputField("tsz")
.AddOutputField("vec")
.WithTimezone("America/Havana");
milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
// Note: The timezone query parameter is not supported in @zilliz/milvus2-sdk-node as of v3.0.6.
# Note: The timezone query parameter is not supported in the RESTful API as of v3.0.0.
# Zilliz CLI