python milvus 案例
Milvus 向量数据库学习 Demo 涵盖 1. 连接 MilvusMilvusClient 2. 创建 Collectionschema 索引 3. 插入数据含向量 标量字段 4. 向量相似度搜索search 5. 标量字段过滤查询query 6. 按 ID 查询get 7. 删除数据 8. 删除 Collection import time from typing import Optional, List #向量归一化 import numpy as np from pymilvus import MilvusClient, DataType #向量归一化 def normalize(v): norm np.linalg.norm(v) return [x / norm for x in v] # # 配置按项目实际地址修改 # MILVUS_HOST 127.0.0.1 MILVUS_PORT 19530 库 MILVUS_DB default 表 COLLECTION_NAME t_employee 维度信息 VECTOR_DIM 4 # # 1. 连接 Milvus # def connect_milvus() - Optional[MilvusClient]: 创建 MilvusClient 连接 项目模式MilvusClient(urihttp://host:port, db_name...) try: client MilvusClient( urifhttp://{MILVUS_HOST}:{MILVUS_PORT}, db_nameMILVUS_DB, ) # ping 验证连接 client.list_collections() print(f[OK] 连接 Milvus 成功: {MILVUS_HOST}:{MILVUS_PORT}, db{MILVUS_DB}) return client except Exception as e: print(f[ERROR] 连接 Milvus 失败: {e}) return None # # 2. 创建 Collection # def create_collection(client: MilvusClient): 创建 t_employee 集合 字段设计 - id: VARCHAR 主键 - name: VARCHAR 员工姓名 - department: VARCHAR 部门 - salary: INT64 薪资 - vector: FLOAT_VECTOR 向量4维demo 用 - metadata: JSON 额外信息 # 如果已存在先删除demo 需要 if client.has_collection(collection_nameCOLLECTION_NAME): print(f[INFO] 集合已存在先删除: {COLLECTION_NAME}) client.drop_collection(collection_nameCOLLECTION_NAME) # 创建 Schema # 手动指定主键 # 允许动态字段项目用 True schema client.create_schema( auto_idFalse, enable_dynamic_fieldTrue, ) # 添加字段对标项目 add_field() schema.add_field( field_nameid, datatypeDataType.VARCHAR, max_length100, is_primaryTrue, nullableFalse, ) schema.add_field( field_namename, datatypeDataType.VARCHAR, max_length200, nullableTrue, ) schema.add_field( field_namedepartment, datatypeDataType.VARCHAR, max_length200, nullableTrue, ) schema.add_field( field_namesalary, datatypeDataType.INT64, nullableTrue, ) # 项目里可用大模型解析成1024 维 schema.add_field( field_namevector, datatypeDataType.FLOAT_VECTOR, dimVECTOR_DIM, ) # 代表扩展字段 schema.add_field( field_namemetadata, datatypeDataType.JSON, nullableTrue, ) # 创建集合 client.create_collection( collection_nameCOLLECTION_NAME, schemaschema, ) print(f[OK] 创建集合成功: {COLLECTION_NAME}) # 创建索引 index_params client.prepare_index_params() # 标量字段索引用于过滤加速 index_params.add_index( field_namedepartment, index_typeINVERTED, index_namedepartment_index, params{}, ) # 向量字段索引用于相似度搜索 # 配置AUTOINDEX IP内积AUTOINDEX 自动选择最优索引算法 index_params.add_index( field_namevector, index_typeAUTOINDEX, index_namevector_index, metric_typeIP, # 内积Inner Product ) client.create_index( collection_nameCOLLECTION_NAME, index_paramsindex_params, ) # 加载集合到内存查询前必须加载 client.load_collection(collection_nameCOLLECTION_NAME) # 新增阻塞等待加载完成 while True: state client.get_load_state(collection_nameCOLLECTION_NAME) if state[state] 3: # 3 Loaded break print(等待集合加载中...) time.sleep(0.2) print(f[OK] 索引创建并加载完成) # # 3. 插入数据 # def insert_employees(client: MilvusClient): 插入员工数据 项目模式client.insert(collection_name..., data[dict1, dict2, ...]) employees [ { id: emp_001, name: 张三, department: 技术部, salary: 25000, vector: normalize([0.12, 0.34, 0.56, 0.78]), # 模拟向量 metadata: {level: 高级, skills: [Python, ML]}, }, { id: emp_002, name: 李四, department: 技术部, salary: 20000, vector: normalize([0.15, 0.32, 0.54, 0.80]), metadata: {level: 中级, skills: [Java, Spring]}, }, { id: emp_003, name: 王五, department: 市场部, salary: 18000, vector: normalize([0.90, 0.78, 0.12, 0.34]), metadata: {level: 高级, skills: [营销, 品牌]}, }, { id: emp_004, name: 赵六, department: 市场部, salary: 15000, vector: normalize([0.85, 0.80, 0.15, 0.30]), metadata: {level: 中级, skills: [广告, 策划]}, }, { id: emp_005, name: 陈七, department: 人事部, salary: 16000, vector: normalize([0.45, 0.55, 0.65, 0.75]), metadata: {level: 初级, skills: [招聘, 培训]}, }, ] result client.insert( collection_nameCOLLECTION_NAME, dataemployees, ) print(f[OK] 插入 {len(employees)} 条员工数据, insert_count{result[insert_count]}) # # 4. 向量相似度搜索 # def search_similar_employees(client: MilvusClient, query_vector: List[float], top_k: int 3): 向量相似度搜索核心功能 项目模式client.search(collection_name..., data[vectors], ...) 搜索逻辑 1. 用 query_vector用户问题向量化后的结果去 Milvus 中找最相似的向量 2. 返回 top_k 条最匹配的结果 data # 查询向量支持批量传入列表套列表 anns_field # 在哪个向量字段上搜索 search_params # 搜索参数 output_fields # 返回的标量字段 result client.search( collection_nameCOLLECTION_NAME, data[query_vector], # 查询向量支持批量传入列表套列表 anns_fieldvector, # 在哪个向量字段上搜索 search_params{nprobe: 10}, # 搜索参数 limittop_k, # 返回 top-K output_fields[name, department, salary, metadata], # 返回的标量字段 ) print(f\n--- 向量搜索 (top_k{top_k}) ---) print(f 查询向量: {query_vector}) for i, hit in enumerate(result[0]): print(f [{i1}] id{hit[id]}, 距离{hit[distance]:.4f}) print(f 姓名: {hit[entity][name]}, 部门: {hit[entity][department]}, f薪资: {hit[entity][salary]}) return result # # 5. 标量字段过滤查询 # def query_by_department(client: MilvusClient, department: str): 按部门过滤查询标量字段过滤 项目模式client.query(collection_name..., filter..., output_fields...) result client.query( collection_nameCOLLECTION_NAME, filterfdepartment {department}, output_fields[id, name, department, salary, metadata], ) print(f\n--- 按部门查询: {department} ---) print(f 找到 {len(result)} 人:) for item in result: print(f - {item[name]} | 薪资 {item[salary]} | {item[metadata]}) return result def query_by_salary_range(client: MilvusClient, min_salary: int, max_salary: int): 按薪资范围过滤查询 result client.query( collection_nameCOLLECTION_NAME, filterfsalary {min_salary} salary {max_salary}, output_fields[id, name, department, salary], ) print(f\n--- 按薪资范围查询: {min_salary} ~ {max_salary} ---) print(f 找到 {len(result)} 人:) for item in result: print(f - {item[name]} ({item[department]}) 薪资 {item[salary]}) return result # # 6. 按 ID 查询 # def get_by_ids(client: MilvusClient, ids: List[str]): 按主键 ID 批量查询 result client.get( collection_nameCOLLECTION_NAME, idsids, output_fields[id, name, department, salary, vector], ) print(f\n--- 按 ID 查询: {ids} ---) for item in result: print(f - {item[id]}: {item[name]} | {item[department]} | 向量前3维: {item[vector][:3]}) return result # # 7. 删除数据 # def delete_by_filter(client: MilvusClient, filter_expr: str): 按条件删除对标项目中的 filter 删除 项目模式client.delete(collection_name..., filter...) result client.delete( collection_nameCOLLECTION_NAME, filterfilter_expr, ) print(f\n--- 删除: filter{filter_expr} ---) print(f 删除数量: {result[delete_count]}) return result # # 8. 主程序 # def main(): print( * 60) print(Milvus 向量数据库 Demo — 基于项目模式) print( * 60) # 1. 连接 client connect_milvus() if not client: return # 2. 创建 Collection create_collection(client) # 3. 插入数据 insert_employees(client) 等待数据加载到内存 time.sleep(1) # 4. 向量搜索找最像张三的人 # 张三的向量是 [0.12, 0.34, 0.56, 0.78] # 李四和他最像同技术部王五市场部最不像 search_similar_employees(client, query_vectornormalize([0.12, 0.34, 0.56, 0.78]), top_k3) # 5. 向量搜索找最像王五的人 search_similar_employees(client, query_vectornormalize([0.90, 0.78, 0.12, 0.34]), top_k3) # 6. 按部门过滤 query_by_department(client, 技术部) # 7. 按薪资范围过滤 query_by_salary_range(client, 18000, 30000) # 8. 按 ID 查询 get_by_ids(client, [emp_001, emp_003, emp_005]) # 9. 删除数据 delete_by_filter(client, department 人事部) # 验证删除 remaining client.query( collection_nameCOLLECTION_NAME, filterid ! , output_fields[id, name], ) print(f\n当前剩余数据: {len(remaining)} 条) for item in remaining: print(f - {item[id]}: {item[name]}) # 10. 清理 print(\n--- 清理 ---) client.drop_collection(collection_nameCOLLECTION_NAME) print(f[OK] 删除集合: {COLLECTION_NAME}) print(\n * 60) print(Demo 运行完毕) print( * 60) if __name__ __main__: main()

相关新闻

AI助力组态开发:自然语言生成工业可视化界面

AI助力组态开发:自然语言生成工业可视化界面

1. 项目概述:AI如何重塑组态开发流程在工业自动化和物联网可视化领域,组态软件长期面临着专业门槛高、开发效率低的痛点。传统组态开发需要工程师同时掌握PLC通信协议、数据绑定逻辑和界面设计技能,一个中等复杂度的HMI界面往往需要2-3天开发…

2026/10/16 7:58:00 阅读更多 →
MySQL数据分析入门:从SQL语法到电商用户行为分析实战

MySQL数据分析入门:从SQL语法到电商用户行为分析实战

很多同学想入门数据分析,但面对海量数据、复杂的SQL语法和五花八门的工具,常常感到无从下手。其实,数据分析的核心技能之一就是与数据库打交道,而MySQL作为最流行的开源关系型数据库,是每个数据分析师、后端开发乃至产…

2026/10/16 2:05:47 阅读更多 →
AI原生事实核查技术:多模态处理与实时验证

AI原生事实核查技术:多模态处理与实时验证

1. AI原生事实核查技术的时代背景2023年全球每天产生的数据量已达到328.77亿TB,其中社交媒体平台每分钟就有50万条新内容发布。在这个信息洪流中,虚假信息的传播速度是真实信息的6倍——这是MIT媒体实验室通过追踪300万条新闻得出的结论。作为从业12年的…

2026/10/15 7:02:46 阅读更多 →

最新新闻

nvidia-smi命令找不到?从驱动到容器彻底排查与修复指南

nvidia-smi命令找不到?从驱动到容器彻底排查与修复指南

“nvidia-smi: command not found”大概是 Linux 装显卡驱动时最经典、也最让人摸不着头脑的报错。我第一次遇到是在一台刚装完系统的服务器上,当时还以为是显卡坏了,折腾半天才发现只是驱动没装上。后来搞多了就明白,这个报错本身不复杂&…

2026/10/16 7:57:16 阅读更多 →
大模型上下文管理实战:Token预算、记忆分层与检索召回

大模型上下文管理实战:Token预算、记忆分层与检索召回

前几天我和一朋友调试他做的对话机器人,本来前期测试一切正常,结果聊到第 20 轮的时候,模型突然开始答非所问。他问了一句“我刚才不是说过了吗”,系统毫无反应。我打开日志看了一眼 Token 消耗,心里大概就有数了&…

2026/10/16 7:57:15 阅读更多 →
多模态Agent实战:Harness编排与MCP工具接入的工程架构解析

多模态Agent实战:Harness编排与MCP工具接入的工程架构解析

1. 多模态 Agent:从“能聊”到“能干”的跨越最近这半年,我几乎把所有业余时间都砸在了一个Agent开发项目上。说实话,市面上讨论Agent的声音很多,但真到了自己动手把一个大模型多模态应用和一个可编排的Harness框架、再加上MCP协议…

2026/10/16 7:57:15 阅读更多 →
STM32 FFT频谱分析实战:采样、窗函数与幅值标定指南

STM32 FFT频谱分析实战:采样、窗函数与幅值标定指南

简介:面向STM32F1单片机实现FFT的资源包,适合嵌入式开发者和数字信号处理初学者,系统讲解在Cortex-M3内核上完成快速傅里叶变换所需的算法原理、内存管理、中断定时触发、CMSIS-DSP库应用以及误差与低功耗优化等关键环节。压缩包共225个文件&…

2026/10/16 7:57:15 阅读更多 →
共享内存FIFO:信号量+环形缓冲实现进程间高频通信

共享内存FIFO:信号量+环形缓冲实现进程间高频通信

简介:ShmFifo源代码C版是一份聚焦共享内存与信号量协同工作的进程间通信示例,适合正在学习Linux IPC机制、需要实现多进程高效数据交换的开发者。资源由C语言过程调用版本改造而来,把一块共享内存与互斥、满、空三个信号量封装成C类&#xff…

2026/10/16 7:57:15 阅读更多 →
共享内存与信号量:C++跨进程FIFO队列源码深度解析

共享内存与信号量:C++跨进程FIFO队列源码深度解析

简介:面向系统编程学习者与 Linux 环境开发者,这份 C 版 ShmFifo 源码包演示了共享内存与信号量的结合实践:将一块共享内存和 mutex、full、empty 三个信号量封装为 ShmFifo 类,并提供写入、读取、释放与测试代码,适合…

2026/10/16 7:56:15 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →