董绣梓 发表于 2026-3-5 11:20:02

AI开发-python-milvus向量数据库(2-16 -milvus-三种查询<get-query-迭代器>)

Milvus 三种核心查询方式:get/query/迭代器

在向量数据库的实际应用中,查询功能是衔接数据存储与业务落地的核心环节。Milvus 作为主流向量数据库,针对不同业务场景设计了多种灵活的查询方式,其中 get 主键查询、query 条件过滤查询、query_iterator 迭代器查询是最常用的三种,掌握它们的使用场景与核心逻辑,能大幅提升数据查询效率与开发体验。本文将结合实际应用场景,详细拆解这三种查询方式的区别与使用技巧,帮助开发者快速上手。在正式讲解查询方式前,先简单梳理下前置准备工作。我们需先建立 Milvus 客户端连接,定义集合结构,包含主键、向量字段及属性字段,插入测试数据后为向量字段创建索引,确保查询性能。完成基础环境搭建后,即可根据实际业务需求,选择合适的查询方式。一、get 主键查询:精准定位,高效快捷

get 查询是 Milvus 中最基础、最高效的查询方式,核心作用是通过主键 ID 精准定位单条或多条数据,相当于“按身份证找数据”,适用于已知主键、需要快速获取对应完整数据的场景。其核心优势在于“精准”与“高效”——由于主键具有唯一性,Milvus 会直接通过主键索引定位数据,无需遍历整个集合,查询速度极快,尤其适合高频次、精准化的数据查询场景,比如根据用户 ID 查询对应向量特征、根据商品 ID 获取商品向量及属性信息等。使用时只需指定目标集合名称、待查询的主键 ID 列表,以及需要返回的字段(如向量、属性字段),即可快速获取对应数据,操作简洁且返回结果精准,无需复杂的条件筛选,是日常开发中最常用的“精准查询工具”。二、query 条件过滤查询:灵活筛选,按需匹配

与 get 查询的“精准定位”不同,query 查询主打“条件过滤”,核心作用是根据自定义的属性条件,筛选出符合要求的所有数据,相当于“按筛选条件找数据”,适用于未知主键、需要根据属性特征筛选数据的场景。其核心优势在于“灵活性”——支持多种条件筛选语法,比如模糊匹配、范围查询、多条件组合等,能够精准匹配业务中的复杂筛选需求。例如,筛选出属性中包含特定关键词的数据、筛选出符合某个数值范围的向量数据,同时还能指定返回字段和查询条数限制,兼顾灵活性与可控性。这种查询方式常用于业务场景中的数据筛选,比如在图像检索中,筛选出特定颜色标签的图像向量;在用户画像分析中,筛选出符合特定特征的用户向量,满足多样化的业务查询需求。需要注意的是,使用前需确保集合已加载,否则会出现集合找不到的错误,影响查询正常执行。三、query_iterator 迭代器查询:分批获取,高效处理海量数据

迭代器查询(query_iterator)是针对海量数据场景设计的查询方式,核心作用是将查询结果分批返回,而非一次性加载所有数据,相当于“分批读取数据”,适用于数据量较大、一次性加载会占用大量内存的场景。其核心优势在于“低内存占用”与“可操作性”——当查询结果条数较多时,一次性返回所有数据会消耗大量内存,甚至导致程序卡顿,而迭代器查询可以设置分批大小,每次只返回少量数据,处理完一批后再获取下一批,有效降低内存压力。同时,迭代器支持循环读取,可灵活控制数据处理节奏,便于对查询结果进行逐批处理、分析或存储。使用时需先建立集合连接,指定分批大小、筛选条件及返回字段,通过循环迭代的方式逐批获取数据,处理完成后关闭迭代器,避免资源浪费。这种查询方式常用于海量数据的批量处理场景,比如批量导出符合条件的向量数据、逐批分析海量用户的向量特征等,兼顾查询效率与系统稳定性。四、三种查询方式核心对比与使用建议

为了帮助大家快速区分三种查询方式,这里整理了核心差异与适用场景,方便大家根据业务需求快速选择:1. get 主键查询:精准、高效,适用于已知主键、需快速获取数据的场景,优先用于高频精准查询;2. query 条件过滤查询:灵活、可控,适用于未知主键、需按属性条件筛选数据的场景,满足复杂筛选需求;3. query_iterator 迭代器查询:低内存、可分批,适用于海量数据查询,避免一次性加载占用过多资源。总结来说,三种查询方式各有侧重,无优劣之分,关键在于匹配业务场景。日常开发中,可根据是否已知主键、数据量大小、筛选需求等,选择合适的查询方式,既能提升查询效率,也能降低系统资源消耗。掌握这三种核心查询方式,就能轻松应对 Milvus 大部分数据查询场景,为向量数据库相关开发提供有力支撑。 代码:from pymilvus import MilvusClient,DataType, Collection,connections
client = MilvusClient(
    uri="http://192.168.211.128:19530",
    token="root:Milvus"
)


#准备数据环境

#删除集合
client.drop_collection(
    collection_name="data_t"
)


#Create schema
schema = MilvusClient.create_schema(
    auto_id=False,
    enable_dynamic_field=True,
)

#Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
schema.add_field(field_name="color", datatype=DataType.VARCHAR, max_length=512)

#创建 Collections
client.create_collection(
    collection_name="data_t",
    schema=schema
)


data = [
      {"id": 0, "vector": , "color": "pink_8682"},
      {"id": 1, "vector": , "color": "red_7025"},
      {"id": 2, "vector": , "color": "orange_6781"},
      {"id": 3, "vector": , "color": "pink_9298"},
      {"id": 4, "vector": , "color": "red_4794"},
      {"id": 5, "vector": , "color": "yellow_4222"},
      {"id": 6, "vector": , "color": "red_9392"},
      {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
      {"id": 8, "vector": , "color": "white_9381"},
      {"id": 9, "vector": , "color": "purple_4976"},
]


#插入数据
res = client.insert(
    collection_name="data_t",
    data=data
)

print(res)


#Set up the index parameters
index_params = MilvusClient.prepare_index_params()

#   Add an index on the vector field.
index_params.add_index(
    field_name="vector",
    metric_type="COSINE",
    index_type="IVF_FLAT",
    index_name="vector_index",
    params={ "nlist": 128 }
)

#   Create an index file
client.create_index(
    collection_name="data_t",
    index_params=index_params,
    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
)

# 5. Describe index
res = client.list_indexes(
    collection_name="data_t"
)
# Set up index parameters for querying没有这句会报 集合找不到的错误
client.load_collection(collection_name="data_t")
print(res)


print('主键 get 查询数据')
res = client.get(
    collection_name="data_t",
    ids=,
    output_fields=["vector", "color"]
)

print(res)
print('--------------')

print('query 查询数据')

res = client.query(
    collection_name="data_t",
    filter="color like \"red%\"",
    output_fields=["vector", "color"],
    limit=3
)
print(res)
print('--------------')


print('迭代器查询')

connections.connect("default", host='172.25.131.110', port='19530')
collection = Collection("data_t")

iterator = collection.query_iterator(
    batch_size=2,
    expr="color like \"red%\"",
    output_fields=["color"]
)

results = []

while True:
    print('*************')
    result = iterator.next()
    if not result:
      iterator.close()
      break

    print(result)结果输出:
{'insert_count': 10, 'ids': }
['vector_index']
主键 get 查询数据
data: ["{'vector': , 'color': 'pink_8682', 'id': 0}", "{'vector': , 'color': 'red_7025', 'id': 1}", "{'vector': , 'color': 'orange_6781', 'id': 2}"] 
--------------
query 查询数据
data: ["{'color': 'red_7025', 'id': 1, 'vector': }", "{'color': 'red_4794', 'id': 4, 'vector': }", "{'color': 'red_9392', 'id': 6, 'vector': }"] 
--------------
迭代器查询
*************
[{'color': 'red_7025', 'id': 1}, {'color': 'red_4794', 'id': 4}]
*************
[{'color': 'red_9392', 'id': 6}]
*************
更多学习资料尽在老虎网盘资源老虎网盘资源
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

左丘纨 发表于 2026-3-10 17:14:10

谢谢分享,辛苦了

东郭欣然 发表于 2026-3-11 08:34:55

yyds。多谢分享

尝琨 发表于 2026-3-11 09:01:49

新版吗?好像是停更了吧。
页: [1]
查看完整版本: AI开发-python-milvus向量数据库(2-16 -milvus-三种查询<get-query-迭代器>)