找回密码
 立即注册
首页 业界区 安全 AI开发-python-milvus向量数据库(2-16 -milvus-三种查 ...

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

董绣梓 1 小时前
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 大部分数据查询场景,为向量数据库相关开发提供有力支撑。 代码:
  1. from pymilvus import MilvusClient,DataType, Collection,connections
  2. client = MilvusClient(
  3.     uri="http://192.168.211.128:19530",
  4.     token="root:Milvus"
  5. )
  6. #准备数据环境
  7. #删除集合
  8. client.drop_collection(
  9.     collection_name="data_t"
  10. )
  11. #Create schema
  12. schema = MilvusClient.create_schema(
  13.     auto_id=False,
  14.     enable_dynamic_field=True,
  15. )
  16. #Add fields to schema
  17. schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
  18. schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
  19. schema.add_field(field_name="color", datatype=DataType.VARCHAR, max_length=512)
  20. #创建 Collections
  21. client.create_collection(
  22.     collection_name="data_t",
  23.     schema=schema
  24. )
  25. data = [
  26.         {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
  27.         {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
  28.         {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
  29.         {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
  30.         {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
  31.         {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
  32.         {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
  33.         {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
  34.         {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
  35.         {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},
  36. ]
  37. #插入数据
  38. res = client.insert(
  39.     collection_name="data_t",
  40.     data=data
  41. )
  42. print(res)
  43. #  Set up the index parameters
  44. index_params = MilvusClient.prepare_index_params()
  45. #   Add an index on the vector field.
  46. index_params.add_index(
  47.     field_name="vector",
  48.     metric_type="COSINE",
  49.     index_type="IVF_FLAT",
  50.     index_name="vector_index",
  51.     params={ "nlist": 128 }
  52. )
  53. #   Create an index file
  54. client.create_index(
  55.     collection_name="data_t",
  56.     index_params=index_params,
  57.     sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
  58. )
  59. # 5. Describe index
  60. res = client.list_indexes(
  61.     collection_name="data_t"
  62. )
  63. # Set up index parameters for querying  没有这句会报 集合找不到的错误
  64. client.load_collection(collection_name="data_t")
  65. print(res)
  66. print('主键 get 查询数据')
  67. res = client.get(
  68.     collection_name="data_t",
  69.     ids=[0, 1, 2],
  70.     output_fields=["vector", "color"]
  71. )
  72. print(res)
  73. print('--------------')
  74. print('query 查询数据')
  75. res = client.query(
  76.     collection_name="data_t",
  77.     filter="color like "red%"",
  78.     output_fields=["vector", "color"],
  79.     limit=3
  80. )
  81. print(res)
  82. print('--------------')
  83. print('迭代器查询')
  84. connections.connect("default", host='172.25.131.110', port='19530')
  85. collection = Collection("data_t")
  86. iterator = collection.query_iterator(
  87.     batch_size=2,
  88.     expr="color like "red%"",
  89.     output_fields=["color"]
  90. )
  91. results = []
  92. while True:
  93.     print('*************')
  94.     result = iterator.next()
  95.     if not result:
  96.         iterator.close()
  97.         break
  98.     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}]
*************
更多学习资料尽在老虎网盘资源  老虎网盘资源
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册