以下是根据 Milvus 官方文档整理的具体 PyMilvus 利用教程,基于 Milvus 2.5.x 版本:
PyMilvus 利用教程
目次
- 安装与情况准备
- 毗连 Milvus 服务
- 数据模型基础概念
- 创建集合(Collection)
- 插入数据
- 创建索引
- 向量搜索
- 删除操作
- 完备示例
- 注意事项
安装与情况准备
搭建 Milvus 服务 基于Docker
- # 记得提前安装Docker
- curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
- bash standalone_embed.sh start
- # 数据可视化工具
- docker run -p 8000:3000 -e MILVUS_URL=你的IP:19530 zilliz/attu:v2.5
复制代码 要求:
- Python 3.10+
- Milvus 2.5.x 服务(单机版或集群)
毗连 Milvus 服务
- from pymilvus import connections
- # 连接单机版
- connections.connect(
- alias="default",
- host="localhost",
- port="19530"
- )
- # 连接集群或云服务(如Zilliz Cloud)
- # connections.connect(
- # alias="cloud",
- # uri="https://xxx.api.region.zillizcloud.com",
- # token="your_api_key"
- # )
复制代码 数据模型基础概念
- Collection: 类似数据库的表,包罗多个字段
- Schema: 界说字段类型和束缚
- Partition: 数据分区,用于优化查询性能
- Index: 加快向量搜索的索引结构
创建集合(Collection)
- from pymilvus import (
- FieldSchema, CollectionSchema, DataType,
- Collection
- )
- # 定义字段
- fields = [
- FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
- FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128),
- FieldSchema(name="age", dtype=DataType.INT32)
- ]
- # 创建Schema
- schema = CollectionSchema(fields, description="人脸特征向量库")
- # 创建Collection
- collection = Collection(name="face_db", schema=schema)
复制代码 参数说明:
- auto_id: 是否自动生成主键
- dim: 向量维度(必须与后续插入数据维度一致)
插入数据
- import random
- # 生成随机数据
- num_entities = 1000
- vectors = [[random.random() for _ in range(128)] for _ in range(num_entities)]
- ages = [random.randint(18, 65) for _ in range(num_entities)]
- # 构造插入数据
- data = [
- vectors, # 对应embedding字段
- ages # 对应age字段
- ]
- # 插入数据
- insert_result = collection.insert(data)
- # 获取自动生成的ID
- print(insert_result.primary_keys)
复制代码 创建索引
- index_params = {
- "index_type": "IVF_FLAT",
- "metric_type": "L2",
- "params": {"nlist": 128}
- }
- collection.create_index(
- field_name="embedding",
- index_params=index_params
- )
复制代码 常用索引类型:
- FLAT: 精确搜索
- IVF_FLAT: 均衡型
- HNSW: 高召回率
- DISKANN: 磁盘存储优化
向量搜索
- # 加载集合到内存
- collection.load()
- # 准备搜索向量
- search_vector = [random.random() for _ in range(128)]
- # 构建搜索参数
- search_params = {
- "metric_type": "L2",
- "params": {"nprobe": 10}
- }
- # 执行搜索
- results = collection.search(
- data=[search_vector],
- anns_field="embedding",
- param=search_params,
- limit=5,
- output_fields=["age"] # 返回的额外字段
- )
- # 解析结果
- for hits in results:
- for hit in hits:
- print(f"ID: {hit.id}, 距离: {hit.distance}, Age: {hit.entity.get('age')}")
复制代码 删除操作
- # 删除实体
- expr = "age >= 60"
- collection.delete(expr)
- # 删除集合
- collection.drop()
复制代码 完备示例
- from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
- # 连接服务
- connections.connect(host='localhost', port='19530')
- # 创建集合
- fields = [
- FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
- FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128)
- ]
- schema = CollectionSchema(fields)
- collection = Collection("test_collection", schema)
- # 插入数据
- data = [[[random.random() for _ in range(128)] for _ in range(1000)]]
- collection.insert(data)
- # 创建索引
- index_params = {"index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 100}}
- collection.create_index("vector", index_params)
- collection.load()
- # 搜索
- search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
- results = collection.search(
- data=[[0.5]*128],
- anns_field="vector",
- param=search_params,
- limit=3
- )
- # 输出结果
- print("搜索结果:")
- for hits in results:
- for hit in hits:
- print(f"ID: {hit.id}, 距离: {hit.distance}")
- # 清理
- collection.drop()
复制代码 注意事项
- 版本兼容性:确保 PyMilvus 版本与 Milvus 服务端版本匹配
- 资源管理:
- 搜索前必须调用 load() 加载集合
- 大数据量时注意内存利用
- 索引选择:根据数据规模和性能需求选择符合索引类型
- 数据预处置惩罚:确保向量维度与 schema 界说一致
- 分页查询:大数据量查询利用 offset + limit 分页
官方文档参考:
- Milvus Documentation
- PyMilvus API Reference
建议结合具体业务需求调解参数,并针对实际数据量进行性能测试。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |