获取和标量查询
本指南演示如何通过 ID 获取实体并进行标量过滤。标量过滤可检索符合指定过滤条件的实体。
概述
标量查询使用布尔表达式根据定义的条件过滤 Collections 中的实体。查询结果是一组符合定义条件的实体。与向量搜索(在 Collections 中识别与给定向量最接近的向量)不同,查询是根据特定条件过滤实体。
在 Milvus 中,过滤器总是一个由字段名和操作符组成的字符串。在本指南中,你将看到各种过滤器示例。要了解更多操作符详情,请参阅参考资料部分。
准备工作
下面的步骤将重新利用代码连接到 Milvus,快速建立一个 Collections,并将 1000 多个随机生成的实体插入到 Collections 中。
步骤 1:创建 Collections
使用 MilvusClient
连接到 Milvus 服务器,并使用 create_collection()
创建 Collections。
使用 MilvusClientV2
连接到 Milvus 服务器,并使用 createCollection()
创建 Collections。
使用 MilvusClient
连接到 Milvus 服务器,并使用 createCollection()
创建 Collections。
from pymilvus import MilvusClient
# 1. Set up a Milvus client
client = MilvusClient(
uri="http://localhost:19530"
)
# 2. Create a collection
client.create_collection(
collection_name="quick_setup",
dimension=5,
)
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.DropCollectionReq;
import io.milvus.v2.service.partition.request.CreatePartitionReq;
import io.milvus.v2.service.vector.request.GetReq;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.response.GetResp;
import io.milvus.v2.service.vector.response.InsertResp;
import java.util.*;
String CLUSTER_ENDPOINT = "http://localhost:19530";
// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder()
.uri(CLUSTER_ENDPOINT)
.build();
MilvusClientV2 client = new MilvusClientV2(connectConfig);
// 2. Create a collection in quick setup mode
CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()
.collectionName("quick_setup")
.dimension(5)
.metricType("IP")
.build();
client.createCollection(quickSetupReq);
const { MilvusClient, DataType, sleep } = require("@zilliz/milvus2-sdk-node")
const address = "http://localhost:19530"
// 1. Set up a Milvus Client
client = new MilvusClient({address});
// 2. Create a collection in quick setup mode
await client.createCollection({
collection_name: "quick_setup",
dimension: 5,
});
第二步:插入随机生成的实体
使用 insert()
将实体插入 Collections。
使用 insert()
将实体插入 Collections。
使用 insert()
将实体插入 Collections。
# 3. Insert randomly generated vectors
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = []
for i in range(1000):
current_color = random.choice(colors)
current_tag = random.randint(1000, 9999)
data.append({
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": current_color,
"tag": current_tag,
"color_tag": f"{current_color}_{str(current_tag)}"
})
print(data[0])
# Output
#
# {
# "id": 0,
# "vector": [
# 0.7371107800002366,
# -0.7290389773227746,
# 0.38367002049157417,
# 0.36996000494220627,
# -0.3641898951462792
# ],
# "color": "yellow",
# "tag": 6781,
# "color_tag": "yellow_6781"
# }
res = client.insert(
collection_name="quick_setup",
data=data
)
print(res)
# Output
#
# {
# "insert_count": 1000,
# "ids": [
# 0,
# 1,
# 2,
# 3,
# 4,
# 5,
# 6,
# 7,
# 8,
# 9,
# "(990 more items hidden)"
# ]
# }
// 3. Insert randomly generated vectors into the collection
List<String> colors = Arrays.asList("green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey");
List<JsonObject> data = new ArrayList<>();
Gson gson = new Gson();
for (int i=0; i<1000; i++) {
Random rand = new Random();
String current_color = colors.get(rand.nextInt(colors.size()-1));
int current_tag = rand.nextInt(8999) + 1000;
JsonObject row = new JsonObject();
row.addProperty("id", (long) i);
row.add("vector", gson.toJsonTree(Arrays.asList(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), rand.nextFloat())));
row.addProperty("color", current_color);
row.addProperty("tag", current_tag);
row.addProperty("color_tag", current_color + '_' + String.valueOf(rand.nextInt(8999) + 1000));
data.add(row);
}
InsertReq insertReq = InsertReq.builder()
.collectionName("quick_setup")
.data(data)
.build();
InsertResp insertResp = client.insert(insertReq);
System.out.println(insertResp.getInsertCnt());
// Output:
// 1000
// 3. Insert randomly generated vectors
const colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
var data = []
for (let i = 0; i < 1000; i++) {
current_color = colors[Math.floor(Math.random() * colors.length)]
current_tag = Math.floor(Math.random() * 8999 + 1000)
data.push({
"id": i,
"vector": [Math.random(), Math.random(), Math.random(), Math.random(), Math.random()],
"color": current_color,
"tag": current_tag,
"color_tag": `${current_color}_${current_tag}`
})
}
console.log(data[0])
// Output
//
// {
// id: 0,
// vector: [
// 0.16022394821966035,
// 0.6514875214491056,
// 0.18294484964044666,
// 0.30227694168725394,
// 0.47553087493572255
// ],
// color: 'blue',
// tag: 8907,
// color_tag: 'blue_8907'
// }
//
res = await client.insert({
collection_name: "quick_setup",
data: data
})
console.log(res.insert_cnt)
// Output
//
// 1000
//
第 3 步:创建分区并插入更多实体
使用 create_partition()
创建分区,并使用 insert()
将更多实体插入 Collections。
使用 createPartition()
创建分区并 insert()
将更多实体插入 Collections。
使用 createPartition()
创建分区,并 insert()
向 Collection 插入更多实体。
# 4. Create partitions and insert more entities
client.create_partition(
collection_name="quick_setup",
partition_name="partitionA"
)
client.create_partition(
collection_name="quick_setup",
partition_name="partitionB"
)
data = []
for i in range(1000, 1500):
current_color = random.choice(colors)
data.append({
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": current_color,
"tag": current_tag,
"color_tag": f"{current_color}_{str(current_tag)}"
})
res = client.insert(
collection_name="quick_setup",
data=data,
partition_name="partitionA"
)
print(res)
# Output
#
# {
# "insert_count": 500,
# "ids": [
# 1000,
# 1001,
# 1002,
# 1003,
# 1004,
# 1005,
# 1006,
# 1007,
# 1008,
# 1009,
# "(490 more items hidden)"
# ]
# }
data = []
for i in range(1500, 2000):
current_color = random.choice(colors)
data.append({
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": current_color,
"tag": current_tag,
"color_tag": f"{current_color}_{str(current_tag)}"
})
res = client.insert(
collection_name="quick_setup",
data=data,
partition_name="partitionB"
)
print(res)
# Output
#
# {
# "insert_count": 500,
# "ids": [
# 1500,
# 1501,
# 1502,
# 1503,
# 1504,
# 1505,
# 1506,
# 1507,
# 1508,
# 1509,
# "(490 more items hidden)"
# ]
# }
// 4. Create partitions and insert some more data
CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
client.createPartition(createPartitionReq);
createPartitionReq = CreatePartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionB")
.build();
client.createPartition(createPartitionReq);
data.clear();
for (int i=1000; i<1500; i++) {
Random rand = new Random();
String current_color = colors.get(rand.nextInt(colors.size()-1));
int current_tag = rand.nextInt(8999) + 1000;
JsonObject row = new JsonObject();
row.addProperty("id", (long) i);
row.add("vector", gson.toJsonTree(Arrays.asList(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), rand.nextFloat())));
row.addProperty("color", current_color);
row.addProperty("tag", current_tag);
data.add(row);
}
insertReq = InsertReq.builder()
.collectionName("quick_setup")
.data(data)
.partitionName("partitionA")
.build();
insertResp = client.insert(insertReq);
System.out.println(insertResp.getInsertCnt());
// Output:
// 500
data.clear();
for (int i=1500; i<2000; i++) {
Random rand = new Random();
String current_color = colors.get(rand.nextInt(colors.size()-1));
int current_tag = rand.nextInt(8999) + 1000;
JsonObject row = new JsonObject();
row.addProperty("id", (long) i);
row.add("vector", gson.toJsonTree(Arrays.asList(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), rand.nextFloat())));
row.addProperty("color", current_color);
row.addProperty("tag", current_tag);
data.add(row);
}
insertReq = InsertReq.builder()
.collectionName("quick_setup")
.data(data)
.partitionName("partitionB")
.build();
insertResp = client.insert(insertReq);
System.out.println(insertResp.getInsertCnt());
// Output:
// 500
// 4. Create partitions and insert more entities
await client.createPartition({
collection_name: "quick_setup",
partition_name: "partitionA"
})
await client.createPartition({
collection_name: "quick_setup",
partition_name: "partitionB"
})
data = []
for (let i = 1000; i < 1500; i++) {
current_color = colors[Math.floor(Math.random() * colors.length)]
current_tag = Math.floor(Math.random() * 8999 + 1000)
data.push({
"id": i,
"vector": [Math.random(), Math.random(), Math.random(), Math.random(), Math.random()],
"color": current_color,
"tag": current_tag,
"color_tag": `${current_color}_${current_tag}`
})
}
res = await client.insert({
collection_name: "quick_setup",
data: data,
partition_name: "partitionA"
})
console.log(res.insert_cnt)
// Output
//
// 500
//
await sleep(5000)
data = []
for (let i = 1500; i < 2000; i++) {
current_color = colors[Math.floor(Math.random() * colors.length)]
current_tag = Math.floor(Math.random() * 8999 + 1000)
data.push({
"id": i,
"vector": [Math.random(), Math.random(), Math.random(), Math.random(), Math.random()],
"color": current_color,
"tag": current_tag,
"color_tag": `${current_color}_${current_tag}`
})
}
res = await client.insert({
collection_name: "quick_setup",
data: data,
partition_name: "partitionB"
})
console.log(res.insert_cnt)
// Output
//
// 500
//
按 ID 获取实体
如果您知道感兴趣的实体的 ID,可以使用 get()
方法。
如果您知道您感兴趣的实体的 ID,可以使用 get()
方法。
如果您知道您感兴趣的实体的 ID,可以使用 get()
方法。
# 4. Get entities by ID
res = client.get(
collection_name="quick_setup",
ids=[0, 1, 2]
)
print(res)
# Output
#
# [
# {
# "id": 0,
# "vector": [
# 0.68824464,
# 0.6552274,
# 0.33593303,
# -0.7099536,
# -0.07070546
# ],
# "color_tag": "green_2006",
# "color": "green"
# },
# {
# "id": 1,
# "vector": [
# -0.98531723,
# 0.33456197,
# 0.2844234,
# 0.42886782,
# 0.32753858
# ],
# "color_tag": "white_9298",
# "color": "white"
# },
# {
# "id": 2,
# "vector": [
# -0.9886812,
# -0.44129863,
# -0.29859528,
# 0.06059075,
# -0.43817034
# ],
# "color_tag": "grey_5312",
# "color": "grey"
# }
# ]
// 5. Get entities by ID
GetReq getReq = GetReq.builder()
.collectionName("quick_setup")
.ids(Arrays.asList(0L, 1L, 2L))
.build();
GetResp entities = client.get(getReq);
System.out.println(entities.getGetResults());
// Output:
// [
// QueryResp.QueryResult(entity={color=blue, color_tag=blue_4025, vector=[0.64311606, 0.73486423, 0.7352375, 0.7020566, 0.9885356], id=0, tag=4018}),
// QueryResp.QueryResult(entity={color=red, color_tag=red_4788, vector=[0.27244627, 0.7068031, 0.25976115, 0.69258106, 0.8767045], id=1, tag=6611}),
// QueryResp.QueryResult(entity={color=yellow, color_tag=yellow_8382, vector=[0.19625628, 0.40176708, 0.13231951, 0.50702184, 0.88406855], id=2, tag=5349})
//]
// 5. Get entities by id
res = await client.get({
collection_name: "quick_setup",
ids: [0, 1, 2],
output_fields: ["vector", "color_tag"]
})
console.log(res.data)
// Output
//
// [
// {
// vector: [
// 0.16022394597530365,
// 0.6514875292778015,
// 0.18294484913349152,
// 0.30227693915367126,
// 0.47553086280822754
// ],
// '$meta': { color: 'blue', tag: 8907, color_tag: 'blue_8907' },
// id: '0'
// },
// {
// vector: [
// 0.2459285855293274,
// 0.4974019527435303,
// 0.2154673933982849,
// 0.03719571232795715,
// 0.8348019123077393
// ],
// '$meta': { color: 'grey', tag: 3710, color_tag: 'grey_3710' },
// id: '1'
// },
// {
// vector: [
// 0.9404329061508179,
// 0.49662265181541443,
// 0.8088793158531189,
// 0.9337621331214905,
// 0.8269071578979492
// ],
// '$meta': { color: 'blue', tag: 2993, color_tag: 'blue_2993' },
// id: '2'
// }
// ]
//
从分区获取实体
您还可以从特定分区中获取实体。
# 5. Get entities from partitions
res = client.get(
collection_name="quick_setup",
ids=[1000, 1001, 1002],
partition_names=["partitionA"]
)
print(res)
# Output
#
# [
# {
# "color": "green",
# "tag": 1995,
# "color_tag": "green_1995",
# "id": 1000,
# "vector": [
# 0.7807706,
# 0.8083741,
# 0.17276904,
# -0.8580777,
# 0.024156934
# ]
# },
# {
# "color": "red",
# "tag": 1995,
# "color_tag": "red_1995",
# "id": 1001,
# "vector": [
# 0.065074645,
# -0.44882354,
# -0.29479212,
# -0.19798489,
# -0.77542555
# ]
# },
# {
# "color": "green",
# "tag": 1995,
# "color_tag": "green_1995",
# "id": 1002,
# "vector": [
# 0.027934508,
# -0.44199976,
# -0.40262738,
# -0.041511405,
# 0.024782438
# ]
# }
# ]
// 5. Get entities by ID in a partition
getReq = GetReq.builder()
.collectionName("quick_setup")
.ids(Arrays.asList(1001L, 1002L, 1003L))
.partitionName("partitionA")
.build();
entities = client.get(getReq);
System.out.println(entities.getGetResults());
// Output:
// [
// QueryResp.QueryResult(entity={color=pink, vector=[0.28847772, 0.5116072, 0.5695933, 0.49643654, 0.3461541], id=1001, tag=9632}),
// QueryResp.QueryResult(entity={color=blue, vector=[0.22428268, 0.8648047, 0.78426147, 0.84020555, 0.60779166], id=1002, tag=4523}),
// QueryResp.QueryResult(entity={color=white, vector=[0.4081068, 0.9027214, 0.88685805, 0.38036376, 0.27950126], id=1003, tag=9321})
// ]
// 5.1 Get entities by id in a partition
res = await client.get({
collection_name: "quick_setup",
ids: [1000, 1001, 1002],
partition_names: ["partitionA"],
output_fields: ["vector", "color_tag"]
})
console.log(res.data)
// Output
//
// [
// {
// id: '1000',
// vector: [
// 0.014254206791520119,
// 0.5817716121673584,
// 0.19793470203876495,
// 0.8064294457435608,
// 0.7745839357376099
// ],
// '$meta': { color: 'white', tag: 5996, color_tag: 'white_5996' }
// },
// {
// id: '1001',
// vector: [
// 0.6073881983757019,
// 0.05214758217334747,
// 0.730999231338501,
// 0.20900958776474,
// 0.03665429726243019
// ],
// '$meta': { color: 'grey', tag: 2834, color_tag: 'grey_2834' }
// },
// {
// id: '1002',
// vector: [
// 0.48877206444740295,
// 0.34028753638267517,
// 0.6527213454246521,
// 0.9763909578323364,
// 0.8031482100486755
// ],
// '$meta': { color: 'pink', tag: 9107, color_tag: 'pink_9107' }
// }
// ]
//
使用基本操作符
在本节中,您将找到如何在标量过滤中使用基本操作符的示例。您也可以将这些筛选器应用于向量搜索和数据删除。
有关详细信息,请参阅 query()
中的
更多信息,请参阅 query()
以获取更多信息。
更多信息,请参阅 query()
中的
过滤标签值在 1,000 至 1,500 之间的实体。
# 6. Use basic operators res = client.query( collection_name="quick_setup", filter="1000 < tag < 1500", output_fields=["color_tag"], limit=3 ) print(res) # Output # # [ # { # "id": 1, # "color_tag": "pink_1023" # }, # { # "id": 41, # "color_tag": "red_1483" # }, # { # "id": 44, # "color_tag": "grey_1146" # } # ]
// 6. Use basic operators QueryReq queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("1000 < tag < 1500") .outputFields(Arrays.asList("color_tag")) .limit(3) .build(); QueryResp queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [ // {"entity": { // "color_tag": "white_7588", // "id": 34 // }}, // {"entity": { // "color_tag": "orange_4989", // "id": 64 // }}, // {"entity": { // "color_tag": "white_3415", // "id": 73 // }} // ]}
// 6. Use basic operators res = await client.query({ collection_name: "quick_setup", filter: "1000 < tag < 1500", output_fields: ["color_tag"], limit: 3 }) console.log(res.data) // Output // // [ // { // '$meta': { color: 'pink', tag: 1050, color_tag: 'pink_1050' }, // id: '6' // }, // { // '$meta': { color: 'purple', tag: 1174, color_tag: 'purple_1174' }, // id: '24' // }, // { // '$meta': { color: 'orange', tag: 1023, color_tag: 'orange_1023' }, // id: '40' // } // ] //
过滤颜色值设置为棕色的实体。
res = client.query( collection_name="quick_setup", filter='color == "brown"', output_fields=["color_tag"], limit=3 ) print(res) # Output # # [ # { # "color_tag": "brown_5343", # "id": 15 # }, # { # "color_tag": "brown_3167", # "id": 27 # }, # { # "color_tag": "brown_3100", # "id": 30 # } # ]
queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("color == \"brown\"") .outputFields(Arrays.asList("color_tag")) .limit(3) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [ // {"entity": { // "color_tag": "brown_7792", // "id": 3 // }}, // {"entity": { // "color_tag": "brown_9695", // "id": 7 // }}, // {"entity": { // "color_tag": "brown_2551", // "id": 15 // }} // ]}
res = await client.query({ collection_name: "quick_setup", filter: 'color == "brown"', output_fields: ["color_tag"], limit: 3 }) console.log(res.data) // Output // // [ // { // '$meta': { color: 'brown', tag: 6839, color_tag: 'brown_6839' }, // id: '22' // }, // { // '$meta': { color: 'brown', tag: 7849, color_tag: 'brown_7849' }, // id: '32' // }, // { // '$meta': { color: 'brown', tag: 7855, color_tag: 'brown_7855' }, // id: '33' // } // ] //
过滤颜色值未设置为绿色和紫色的实体。
res = client.query( collection_name="quick_setup", filter='color not in ["green", "purple"]', output_fields=["color_tag"], limit=3 ) print(res) # Output # # [ # { # "color_tag": "yellow_6781", # "id": 0 # }, # { # "color_tag": "pink_1023", # "id": 1 # }, # { # "color_tag": "blue_3972", # "id": 2 # } # ]
queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("color not in [\"green\", \"purple\"]") .outputFields(Arrays.asList("color_tag")) .limit(3) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [ // {"entity": { // "color_tag": "white_4597", // "id": 0 // }}, // {"entity": { // "color_tag": "white_8708", // "id": 2 // }}, // {"entity": { // "color_tag": "brown_7792", // "id": 3 // }} // ]}
res = await client.query({ collection_name: "quick_setup", filter: 'color not in ["green", "purple"]', output_fields: ["color_tag"], limit: 3 }) console.log(res.data) // Output // // [ // { // '$meta': { color: 'blue', tag: 8907, color_tag: 'blue_8907' }, // id: '0' // }, // { // '$meta': { color: 'grey', tag: 3710, color_tag: 'grey_3710' }, // id: '1' // }, // { // '$meta': { color: 'blue', tag: 2993, color_tag: 'blue_2993' }, // id: '2' // } // ] //
过滤颜色标记以红色开头的文章。
res = client.query( collection_name="quick_setup", filter='color_tag like "red%"', output_fields=["color_tag"], limit=3 ) print(res) # Output # # [ # { # "color_tag": "red_6443", # "id": 17 # }, # { # "color_tag": "red_1483", # "id": 41 # }, # { # "color_tag": "red_4348", # "id": 47 # } # ]
queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("color_tag like \"red%\"") .outputFields(Arrays.asList("color_tag")) .limit(3) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [ // {"entity": { // "color_tag": "red_4929", // "id": 9 // }}, // {"entity": { // "color_tag": "red_8284", // "id": 13 // }}, // {"entity": { // "color_tag": "red_3021", // "id": 44 // }} // ]}
res = await client.query({ collection_name: "quick_setup", filter: 'color_tag like "red%"', output_fields: ["color_tag"], limit: 3 }) console.log(res.data) // Output // // [ // { // '$meta': { color: 'red', tag: 8773, color_tag: 'red_8773' }, // id: '17' // }, // { // '$meta': { color: 'red', tag: 9197, color_tag: 'red_9197' }, // id: '34' // }, // { // '$meta': { color: 'red', tag: 7914, color_tag: 'red_7914' }, // id: '46' // } // ] //
过滤颜色设置为红色且标签值在 1,000 至 1,500 范围内的实体。
res = client.query( collection_name="quick_setup", filter='(color == "red") and (1000 < tag < 1500)', output_fields=["color_tag"], limit=3 ) print(res) # Output # # [ # { # "color_tag": "red_1483", # "id": 41 # }, # { # "color_tag": "red_1100", # "id": 94 # }, # { # "color_tag": "red_1343", # "id": 526 # } # ]
queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("(color == \"red\") and (1000 < tag < 1500)") .outputFields(Arrays.asList("color_tag")) .limit(3) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [ // {"entity": { // "color_tag": "red_8124", // "id": 83 // }}, // {"entity": { // "color_tag": "red_5358", // "id": 501 // }}, // {"entity": { // "color_tag": "red_3564", // "id": 638 // }} // ]}
res = await client.query({ collection_name: "quick_setup", filter: '(color == "red") and (1000 < tag < 1500)', output_fields: ["color_tag"], limit: 3 }) console.log(res.data) // Output // // [ // { // '$meta': { color: 'red', tag: 1436, color_tag: 'red_1436' }, // id: '67' // }, // { // '$meta': { color: 'red', tag: 1463, color_tag: 'red_1463' }, // id: '160' // }, // { // '$meta': { color: 'red', tag: 1073, color_tag: 'red_1073' }, // id: '291' // } // ] //
使用高级操作符
本节将举例说明如何在标量过滤中使用高级操作符。您也可以将这些筛选器应用于向量搜索和数据删除。
计数实体
计算 Collections 中实体的总数。
# 7. Use advanced operators # Count the total number of entities in a collection res = client.query( collection_name="quick_setup", output_fields=["count(*)"] ) print(res) # Output # # [ # { # "count(*)": 2000 # } # ]
// 7. Use advanced operators // Count the total number of entities in the collection queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("") .outputFields(Arrays.asList("count(*)")) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [{"entity": {"count(*)": 2000}}]}
// 7. Use advanced operators // Count the total number of entities in a collection res = await client.query({ collection_name: "quick_setup", output_fields: ["count(*)"] }) console.log(res.data) // Output // // [ { 'count(*)': '2000' } ] //
计算特定分区中实体的总数。
# Count the number of entities in a partition res = client.query( collection_name="quick_setup", output_fields=["count(*)"], partition_names=["partitionA"] ) print(res) # Output # # [ # { # "count(*)": 500 # } # ]
// Count the number of entities in a partition queryReq = QueryReq.builder() .collectionName("quick_setup") .partitionNames(Arrays.asList("partitionA")) .filter("") .outputFields(Arrays.asList("count(*)")) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [{"entity": {"count(*)": 500}}]}
// Count the number of entities in a partition res = await client.query({ collection_name: "quick_setup", output_fields: ["count(*)"], partition_names: ["partitionA"] }) console.log(res.data) // Output // // [ { 'count(*)': '500' } ] //
统计符合过滤条件的实体数量
# Count the number of entities that match a specific filter res = client.query( collection_name="quick_setup", filter='(color == "red") and (1000 < tag < 1500)', output_fields=["count(*)"], ) print(res) # Output # # [ # { # "count(*)": 3 # } # ]
// Count the number of entities that match a specific filter queryReq = QueryReq.builder() .collectionName("quick_setup") .filter("(color == \"red\") and (1000 < tag < 1500)") .outputFields(Arrays.asList("count(*)")) .build(); queryResp = client.query(queryReq); System.out.println(JSONObject.toJSON(queryResp)); // Output: // {"queryResults": [{"entity": {"count(*)": 7}}]}
// Count the number of entities that match a specific filter res = await client.query({ collection_name: "quick_setup", filter: '(color == "red") and (1000 < tag < 1500)', output_fields: ["count(*)"] }) console.log(res.data) // Output // // [ { 'count(*)': '10' } ] //
标量过滤器参考
基本操作符
布尔表达式始终是由字段名和操作符组成的字符串。本节将详细介绍基本操作符。
操作符 | 说明 |
---|---|
和 (&&) | 如果两个操作数都为真,则为真 |
或 (||) | 如果任一操作数为真,则为真 |
+, -, *, / | 加法、减法、乘法和除法 |
** | 指数 |
% | 模数 |
<, > | 小于、大于 |
==, != | 等于,不等于 |
<=, >= | 小于或等于,大于或等于 |
不等于 | 逆转给定条件的结果。 |
相似 | 使用通配符将一个值与类似值进行比较。 例如,like "prefix%"匹配以 "prefix "开头的字符串。 |
in | 测试表达式是否匹配值列表中的任何值。 |
高级操作符
count(*)
计算 Collections 中实体的确切数量。将其用作输出字段,可获得 Collections 或分区中实体的确切数目。
注释
这适用于已加载的集合。应将其作为唯一的输出字段。