Requête
Outre les recherches ANN, Milvus prend également en charge le filtrage des métadonnées par le biais de requêtes. Cette page explique comment utiliser Query, Get et QueryIterators pour filtrer les métadonnées.
Vue d'ensemble
Une collection peut stocker différents types de champs scalaires. Milvus peut filtrer les entités en fonction d'un ou de plusieurs champs scalaires. Milvus propose trois types de requêtes : Query, Get et QueryIterator. Le tableau ci-dessous compare ces trois types de requêtes.
Obtenir |
Requête |
QueryIterator |
|
|---|---|---|---|
Scénarios applicables |
Pour trouver les entités qui détiennent les clés primaires spécifiées. |
Pour trouver toutes les entités ou un nombre spécifié d'entités qui répondent aux conditions de filtrage personnalisées. |
Pour trouver toutes les entités qui répondent aux conditions de filtrage personnalisées dans les requêtes paginées. |
Méthode de filtrage |
Par clés primaires |
Par expressions de filtrage. |
Par expressions de filtrage. |
Paramètres obligatoires |
|
|
|
Paramètres facultatifs |
|
|
|
Renvoi |
Renvoie les entités qui détiennent les clés primaires spécifiées dans la collection ou la partition spécifiée. |
Renvoie toutes les entités ou un nombre spécifié d'entités qui répondent aux conditions de filtrage personnalisées dans la collection ou la partition spécifiée. |
Renvoie toutes les entités qui remplissent les conditions de filtrage personnalisées dans la collection ou la partition spécifiée par le biais de requêtes paginées. |
Pour plus d'informations sur le filtrage des métadonnées, voir .
Utiliser Obtenir
Lorsque vous devez rechercher des entités par leurs clés primaires, vous pouvez utiliser la méthode Get. Les exemples de code suivants supposent que votre collection comporte trois champs nommés id, vector et color et renvoient les entités avec les clés primaires 1, 2 et 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"},
]
Vous pouvez obtenir des entités par leur identifiant comme suit.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
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.request.GetResp
import java.util.*;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.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/v2/column"
"github.com/milvus-io/milvus/client/v2/entity"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
milvusAddr := "localhost:19530"
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())
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
const res = client.get({
collection_name="my_collection",
ids=[0,1,2],
output_fields=["vector", "color"]
})
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-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]}]}
Utiliser une requête
Lorsque vous devez trouver des entités en fonction de conditions de filtrage personnalisées, utilisez la méthode Query. Les exemples de code suivants supposent qu'il existe trois champs nommés id, vector, et color et renvoient le nombre spécifié d'entités qui détiennent une valeur color commençant par red.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
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 getResp = client.query(queryReq);
List<QueryResp.QueryResult> results = getResp.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())
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
const res = client.query({
collection_name="my_collection",
filter='color like "red%"',
output_fields=["vector", "color"],
limit(3)
})
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-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]}]}
Utiliser QueryIterator
Lorsque vous devez trouver des entités en fonction de conditions de filtrage personnalisées dans le cadre de requêtes paginées, créez un QueryIterator et utilisez sa méthode next() pour parcourir toutes les entités afin de trouver celles qui répondent aux conditions de filtrage. Les exemples de code suivants supposent qu'il existe trois champs nommés id, vector, et color et renvoient toutes les entités qui contiennent une valeur color en commençant par red.
from pymilvus import connections, Collection
connections.connect(
uri="http://localhost:19530",
token="root:Milvus"
)
collection = Collection("my_collection")
iterator = collection.query_iterator(
batch_size=10,
expr="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(50L)
.outputFields(Collections.singletonList("color"))
.consistencyLevel(ConsistencyLevel.BOUNDED)
.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]
// go
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const iterator = await milvusClient.queryIterator({
collection_name: 'my_collection',
batchSize: 10,
expr: 'color like "red%"',
output_fields: ['color'],
});
const results = [];
for await (const value of iterator) {
results.push(...value);
page += 1;
}
# Not available
Requêtes dans les partitions
Vous pouvez également effectuer des requêtes dans une ou plusieurs partitions en incluant les noms des partitions dans la requête Get, Query ou QueryIterator. Les exemples de code suivants supposent qu'il existe une partition nommée PartitionA dans la collection.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
res = client.get(
collection_name="my_collection",
# highlight-next-line
partitionNames=["partitionA"],
ids=[10, 11, 12],
output_fields=["vector", "color"]
)
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
res = client.query(
collection_name="my_collection",
# highlight-next-line
partitionNames=["partitionA"],
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3
)
# Use QueryIterator
from pymilvus import connections, Collection
connections.connect(
uri="http://localhost:19530",
token="root:Milvus"
)
collection = Collection("my_collection")
iterator = collection.query_iterator(
# highlight-next-line
partition_names=["partitionA"],
batch_size=10,
expr="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 getResp = 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);
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())
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
// Use get
var res = client.query({
collection_name="my_collection",
// highlight-next-line
partition_names=["partitionA"],
filter='color like "red%"',
output_fields=["vector", "color"],
limit(3)
})
// Use query
res = client.query({
collection_name="my_collection",
// highlight-next-line
partition_names=["partitionA"],
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit(3)
})
// Use queryiterator
const iterator = await milvusClient.queryIterator({
collection_name: 'my_collection',
partition_names: ['partitionA'],
batchSize: 10,
expr: 'color like "red%"',
output_fields: ['vector', 'color'],
});
const results = [];
for await (const value of iterator) {
results.push(...value);
page += 1;
}
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
# Use get
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "my_collection",
"partitionNames": ["partitionA"],
"id": [0, 1, 2],
"outputFields": ["vector", "color"]
}'
# Use query
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "my_collection",
"partitionNames": ["partitionA"],
"filter": "color like \"red%\"",
"limit": 3,
"outputFields": ["vector", "color"],
"id": [0, 1, 2]
}'