获取和标量查询
本指南演示如何通过 ID 获取实体并进行标量过滤。标量过滤可检索符合指定过滤条件的实体。
概述
标量查询使用布尔表达式根据定义的条件过滤 Collection 中的实体。查询结果是一组符合定义条件的实体。与向量搜索(在 Collection 中识别与给定向量最接近的向量)不同,查询是根据特定条件过滤实体。
在 Milvus 中,过滤器总是一个由字段名和操作符组成的字符串。在本指南中,你将看到各种过滤器示例。要了解更多操作符详情,请参阅参考资料部分。
准备工作
下面的步骤将重新利用代码连接到 Milvus,快速建立一个 Collection,并将 1000 多个随机生成的实体插入到 Collection 中。
步骤 1:创建 Collection
使用 MilvusClient连接到 Milvus 服务器,并使用 create_collection()创建 Collection。
使用 MilvusClientV2连接到 Milvus 服务器,并使用 createCollection()创建 Collection。
使用 MilvusClient连接到 Milvus 服务器,并使用 createCollection()创建 Collection。
- Python
- Java
- Node.js
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()将实体插入 Collection。
使用 insert()将实体插入 Collection。
使用 insert()将实体插入 Collection。
- Python
- Java
- Node.js
# 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 步:创建 Partition 并插入更多实体
使用 create_partition()创建 Partition,并使用 insert()将更多实体插入 Collection。
使用 createPartition()创建 Partition 并 insert()将更多实体插入 Collection。
使用 createPartition()创建 Partition,并 insert()向 Collection 插入更多实体。
- Python
- Java
- Node.js
# 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()方法。
- Python
- Java
- Node.js
# 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'
// }
// ]
//
从 Partition 获取实体
您还可以从特定 Partition 中获取实体。
- Python
- Java
- Node.js
# 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 之间的实体。
- Python
- Java
- Node.js
# 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'
// }
// ]
// -
过滤颜色值设置为棕色的实体。
- Python
- Java
- Node.js
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'
// }
// ]
// -
过滤颜色值未设置为绿色和紫色的实体。
- Python
- Java
- Node.js
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'
// }
// ]
// -
过滤颜色标记以红色开头的文章。
- Python
- Java
- Node.js
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 范围内的实体。
- Python
- Java
- Node.js
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'
// }
// ]
//
使用高级操作符
本节将举例说明如何在标量过滤中使用高级操作符。您也可以将这些筛选器应用于向量搜索和数据删除。
计数实体
-
计算 Collection 中实体的总数。
- Python
- Java
- Node.js
# 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' } ]
// -
计算特定 Partition 中实体的总数。
- Python
- Java
- Node.js
# 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' } ]
// -
统计符合过滤条件的实体数量
- Python
- Java
- Node.js
# 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(*)计算 Collection 中实体的确切数量。将其用作输出字段,可获得 Collection 或 Partition 中实体的确切数目。
说明注释
这适用于已加载的 Collection。应将其作为唯一的输出字段。