クエリ
ANN 検索に加えて、Zilliz Cloud はクエリによるメタデータフィルタリングもサポートしています。このページでは、Query、Get、QueryIterator を使用してメタデータフィルタリングを実行する方法を紹介します。
コレクションの作成後に新しいフィールドを追加した場合、それらのフィールドを含むクエリは、値を明示的に設定していないエンティティに対して、定義済みのデフォルト値または NULL を返します。詳細は、コレクションスキーマの変更 を参照してください。
概要
コレクションにはさまざまなタイプのスカラーフィールドを格納できます。Zilliz Cloud を使用すると、1 つ以上のスカラーフィールドに基づいてエンティティをフィルタリングできます。Zilliz Cloud は Query、Get、QueryIterator の 3 種類のクエリを提供します。以下の表では、これら 3 種類のクエリを比較します。
Get | Query | QueryIterator | |
|---|---|---|---|
適用シナリオ | 指定したプライマリキーを持つエンティティを検索します。 | カスタムフィルタリング条件を満たすすべてのエンティティ、または指定した数のエンティティを検索します | ページネーションクエリでカスタムフィルタリング条件を満たすすべてのエンティティを検索します。 |
フィルタリング方法 | プライマリキーによる | フィルタリング式による。 | フィルタリング式による。 |
必須パラメーター |
|
|
|
任意パラメーター |
|
|
|
戻り値 | 指定したコレクションまたはパーティション内で、指定したプライマリキーを持つエンティティを返します。 | 指定したコレクションまたはパーティション内で、カスタムフィルタリング条件を満たすすべてのエンティティ、または指定した数のエンティティを返します。 | ページネーションクエリを通じて、指定したコレクションまたはパーティション内でカスタムフィルタリング条件を満たすすべてのエンティティを返します。 |
メタデータフィルタリングの詳細については、フィルタリングの概要フィルタリングの概要 を参照してください。
Get の使用
プライマリキーでエンティティを検索する必要がある場合は、Get メソッドを使用できます。以下のコード例では、コレクションに id、vector、color という 3 つのフィールドがあることを前提としています。
[
{"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"},
]
以下のようにして、ID でエンティティを取得できます。
- 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
Query の使用
基本的なクエリ
カスタムフィルタリング条件でエンティティを検索する必要がある場合は、Query メソッドを使用します。以下のコード例では、id、vector、color という 3 つのフィールドがあることを前提とし、color 値が 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.service.vector.request.QueryReq
import io.milvus.v2.service.vector.request.QueryResp
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}
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
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())
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
クエリ結果の並べ替え | ONDEMAND
デフォルトでは、Query は結果を不特定の順序で返します。1 つ以上のスカラーフィールドで結果を並べ替えるには、order_by パラメーターを使用します。order_by を使用する際は、次の点に注意してください。
-
order_byはlimitと組み合わせて使用する必要があります。 -
サポートされるフィールドタイプ:
INT8、INT16、INT32、INT64、FLOAT、DOUBLE、VARCHAR。ベクトル、JSON、ARRAYフィールドによる並べ替えはサポートされていません。 -
NULL 許容フィールドで並べ替える場合、NULL 値は昇順では末尾に配置され(NULLS LAST)、降順では先頭に配置されます(NULLS FIRST)。
基本的な並べ替え
order_by パラメーターには、"field_name:direction" 形式の文字列のリストを渡します。ここで direction は asc(昇順)または desc(降順)のいずれかです。asc と desc は大文字と小文字を区別することに注意してください。
- 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).
WithOrderBy("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())
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")
.WithOrderBy("id: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
複数フィールドの並べ替え
複数のフィールドで一度に並べ替えることができます。結果はまず、リスト内の最初のフィールドで並べ替えられます。2 つの行でそのフィールドの値が同じ場合、2 番目のフィールドによって順序が決定され、以降も同様です。
- 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"],
)
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).
WithOrderBy("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())
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")
.WithOrderBy("rating:desc,price: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
並べ替えを使用したページネーション
order_by を limit および offset と組み合わせて使用すると、並べ替えられた結果をページングできます。たとえば、価格で並べ替えた商品リストを複数のページに表示する場合、各ページには正しい価格順で次の項目のバッチが重複や抜けなく表示されます。
- 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"],
)
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).
WithOrderBy("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).
WithOrderBy("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())
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")
.WithOrderBy("price: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")
.WithOrderBy("price: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
クエリ結果の集計 | ONDEMAND
1 つ以上のスカラーフィールドでクエリ結果をグループ化し、グループごとに集計を計算できます。サポートされる集計演算子は count、min、max、sum、avg です。
group_by_fields を使用する際は、次の点に注意してください。
-
group_by_fieldsでサポートされるフィールドタイプ:INT8、INT16、INT32、INT64、VARCHAR、TIMESTAMPTZ。FLOAT、DOUBLE、ベクトル、JSON、ARRAYフィールドでグループ化するとエラーが返されます。 -
sumとavgは数値専用です。これらをVARCHARフィールドに適用するとエラーが返されます。
集計を有効にするには、group_by_fields を query() に渡し、集計式(count(*)、count(<field>)、min(<field>)、max(<field>)、sum(<field>)、avg(<field>))を output_fields に追加します。
次の例では、color フィールドでエンティティをグループ化し、各色グループのエンティティ数を返します。
- 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}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("").
WithOutputFields("color", "count(*)", "avg(price)", "max(rating)").
WithGroupByFields("color").
WithLimit(5))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
// Note: milvus-sdk-rust does not expose query-level group-by aggregation
// as of v3.0.2. Use client.search(...) with group_by_field() instead.
#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(*)")
.AddGroupByField("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_field: "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
1 回の呼び出しで複数の集計式を要求できます。次の例では、color でグループ化し、各グループの行数、平均価格、最大評価を返します。
- 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}]
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}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("").
WithOutputFields("color", "count(*)", "avg(price)", "max(rating)").
WithGroupByFields("color").
WithLimit(5))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
// Note: milvus-sdk-rust does not expose query-level group-by aggregation
// as of v3.0.2. Use client.search(...) with group_by_field() instead.
#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(*)")
.AddGroupByField("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_field: "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
複合グループを計算するには、group_by_fields に複数のフィールドを渡します。次の例では、(color, rating) でグループ化し、各バケットの価格範囲を計算します。
- 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},
# ...]
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}
// ...
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("").
WithOutputFields("color", "count(*)", "avg(price)", "max(rating)").
WithGroupByFields("color").
WithLimit(5))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
// Note: milvus-sdk-rust does not expose query-level group-by aggregation
// as of v3.0.2. Use client.search(...) with group_by_field() instead.
#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(*)")
.AddGroupByField("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_field: "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
group_by_fields を limit と組み合わせて、返されるグループ数を制限することもできます。これは、フィールドのカーディナリティが高く、一部のバケットのサンプルだけが必要な場合に便利です。
- 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}]
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}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("").
WithOutputFields("color", "count(*)", "avg(price)", "max(rating)").
WithGroupByFields("color").
WithLimit(5))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
// Note: milvus-sdk-rust does not expose query-level group-by aggregation
// as of v3.0.2. Use client.search(...) with group_by_field() instead.
#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(*)")
.AddGroupByField("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_field: "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
QueryIterator の使用
ページネーションクエリでカスタムフィルタリング条件によりエンティティを検索する必要がある場合は、QueryIterator を作成し、その next() メソッドを使用してすべてのエンティティを反復処理し、フィルタリング条件を満たすものを検索します。以下のコード例では、id、vector、color という 3 つのフィールドがあることを前提とし、color 値が 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;
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()
if err != nil {
fmt.Println(err.Error())
break
}
if resultSet == nil {
break
}
fmt.Println("color: ", resultSet.GetColumn("color").FieldData().GetScalars())
}
err = iterator.Close()
if err != nil {
fmt.Println(err.Error())
}
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
パーティション内でのクエリ
Get、Query、QueryIterator の各リクエストにパーティション名を含めることで、1 つまたは複数のパーティション内でクエリを実行することもできます。以下のコード例では、コレクション内に PartitionA という名前のパーティションがあることを前提としています。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
- Zilliz CLI
res = client.get(
collection_name="my_collection",
partitionNames=["partitionA"],
ids=[10, 11, 12],
output_fields=["vector", "color"]
)
res = client.query(
collection_name="my_collection",
partitionNames=["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
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())
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
Query を使用したランダムサンプリング
データ探索や開発テストのためにコレクションから代表的なデータのサブセットを抽出するには、RANDOM_SAMPLE(sampling_factor) 式を使用します。ここで sampling_factor は、サンプリングするデータの割合を表す 0 から 1 の間の浮動小数点数です。
詳細な使用方法、高度な例、ベストプラクティスについては、ランダムサンプリング を参照してください。
- 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
}
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
クエリのタイムゾーンを一時的に設定する
コレクションに TIMESTAMPTZ フィールドがある場合、クエリ呼び出しで timezone パラメーターを設定することにより、1 回の操作に対してデータベースまたはコレクションのデフォルトのタイムゾーンを一時的に上書きできます。これは、操作中に TIMESTAMPTZ 値がどのように表示および比較されるかを制御します。
timezone の値は、有効な IANA タイムゾーン識別子(たとえば、Asia/Shanghai, America/Chicago, または UTC)である必要があります。TIMESTAMPTZ フィールドの使用方法については、TIMESTAMPTZ フィールド を参照してください。
以下は、クエリ操作のタイムゾーンを一時的に設定する方法の例です。
- 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());
}
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
resultSet, err := client.Query(ctx, milvusclient.NewQueryOption("my_collection").
WithFilter("id <= 10").
WithOutputFields("id", "tsz", "vec").
WithLimit(2).
WithTimezone("America/Havana"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println("id: ", resultSet.GetColumn("id").FieldData().GetScalars())
fmt.Println("tsz: ", resultSet.GetColumn("tsz").FieldData().GetScalars())
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;
}
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: "id <= 10",
output_fields: ["id", "tsz", "vec"],
limit: 2,
timezone: "America/Havana"
});
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": "id <= 10",
"limit": 2,
"outputFields": ["id", "tsz", "vec"],
"timezone": "America/Havana"
}'
# Zilliz CLI