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": [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"},
- ]
- #插入数据
- 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=[0, 1, 2],
- 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': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
['vector_index']
主键 get 查询数据
data: ["{'vector': [0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], 'color': 'pink_8682', 'id': 0}", "{'vector': [0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], 'color': 'red_7025', 'id': 1}", "{'vector': [0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], 'color': 'orange_6781', 'id': 2}"]
--------------
query 查询数据
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]}"]
--------------
迭代器查询
*************
[{'color': 'red_7025', 'id': 1}, {'color': 'red_4794', 'id': 4}]
*************
[{'color': 'red_9392', 'id': 6}]
*************
更多学习资料尽在老虎网盘资源 老虎网盘资源
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |