与向量相似性搜索不同,向量查询通过基于布尔表达式的标量过滤来检索向量。Milvus支持许多标量字段中的数据类型和各种布尔表达式。布尔表达式过滤标量字段或主键字段,并检索与过滤器匹配的所有结果。
一、单次查询
1.加载集合
2.执行查询
python
# 使用集合对象的 query 方法来执行查询操作
res = collection.query(
expr="book_id in [2,4,6,8]", # 查询表达式,筛选满足条件的文档
offset=0, # 结果的偏移量,从结果中的第一个文档开始返回
limit=10, # 返回结果的最大数量
output_fields=["book_id", "book_intro"] # 指定要从查询结果中检索的字段
)
3.检查输出
python
sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res
4.统计实体
在执行查询时,将输出字段设置为count(*),就会返回检索到的实体数量。此时禁用limit
python
res = collection.query(
# filter entities whose ID is in the specified list
expr="book_id in [2,4,6,8]",
output_fields = ["count(*)"],
)
print(res)
print(res[0])
二、查询时使用迭代器
1.使用迭代器查询
python
expr = "600 <= num_pages <= 700"
output_fields=[bookID, authors]
limit = 5
query_iterator = collection.query_iterator(expr, output_fields, limit)
while True:
# turn to the next page
res = query_iterator.next()
if len(res) == 0:
print("query iteration finished, close")
# close the iterator
query_iterator.close()
break
for i in range(len(res)):
print(res[i])
2.使用迭代器搜索
python
vectors_to_search = rng.random((SEARCH_NQ, DIM))
search_params = {
"metric_type": "L2",
"params": {"nprobe": 10, "radius": 1.0},
}
search_iterator = collection.search_iterator(
vectors_to_search,
search_params,
limit=5,
output_fields=[bookID, authors]
)
while True:
# turn to the next page
res = search_iterator.next()
if len(res[0]) == 0:
print("search iteration finished, close")
# close the iterator
search_iterator.close()
break
for i in range(len(res[0])):
print(res[0][i])