以下是 Milvus 的基本使用流程和核心操作指南,适合快速上手:
一、安装与启动
1. Docker 部署(推荐)
# 下载配置文件
wget https://raw.githubusercontent.com/milvus-io/milvus/v2.3.7/deployments/docker/standalone/docker-compose.yml -O docker-compose.yml
# 启动 Milvus
docker-compose up -d
# 验证服务状态
docker-compose ps
默认端口:
- 19530:gRPC 服务端口
- 19121:HTTP 服务端口
2. 源码编译(高级用户)
# 克隆仓库并编译
git clone https://github.com/milvus-io/milvus.git
cd milvus
make install
# 启动服务
./scripts/start_milvus.sh
二、连接 Milvus
Python SDK(推荐)
from pymilvus import connections, utility
# 连接到本地 Milvus
connections.connect(
alias="default",
host='localhost',
port='19530'
)
# 验证连接
print(utility.get_server_version()) # 输出版本信息表示连接成功
三、数据模型操作
1. 创建集合(Collection)
类似关系型数据库中的“表”,存储向量数据和元数据。
from pymilvus import Collection, FieldSchema, CollectionSchema, DataType
# 定义字段
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128), # 128维向量
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512) # 元数据字段
]
# 创建Schema和集合
schema = CollectionSchema(fields=fields, description="文本向量集合")
collection = Collection(name="text_embeddings", schema=schema)
2. 创建索引
为向量字段加速检索(以 HNSW 为例):
index_params = {
"metric_type": "L2", # 欧氏距离
"index_type": "HNSW",
"params": {"M": 16, "efConstruction": 200}
}
collection.create_index(
field_name="embedding",
index_params=index_params
)
# 加载集合到内存(检索前必须执行)
collection.load()
四、数据操作
1. 插入数据
import random
# 生成随机向量和文本
vectors = [[random.random() for _ in range(128)] for _ in range(1000)]
texts = [f"文本_{i}" for i in range(1000)]
# 插入数据
data = [vectors, texts]
insert_result = collection.insert(data)
print(f"插入ID: {insert_result.primary_keys[:5]}")
2. 检索向量
# 准备查询向量
query_vector = [random.random() for _ in range(128)]
# 检索参数
search_params = {
"metric_type": "L2",
"params": {"ef": 50}
}
# 执行检索
results = collection.search(
data=[query_vector], # 查询向量列表
anns_field="embedding",
param=search_params,
limit=10, # 返回Top10结果
output_fields=["text"] # 返回的元数据字段
)
# 处理结果
for hit in results[0]:
print(f"ID: {hit.id}, 距离: {hit.distance}, 文本: {hit.entity.get('text')}")
3. 混合查询(向量+过滤条件)
# 向量检索 + 元数据过滤(如文本包含"重要")
results = collection.search(
data=[query_vector],
anns_field="embedding",
param=search_params,
limit=10,
expr="text like '%重要%'" # SQL-like过滤表达式
)
五、集合管理
1. 查看集合信息
print(f"集合行数: {collection.num_entities}")
print(f"集合描述: {collection.description}")
2. 删除集合
collection.drop() # 谨慎操作,删除后数据无法恢复
六、常见场景示例
1. 图片相似度检索
# 1. 使用CNN提取图片特征(假设已得到128维向量)
image_vector = extract_image_feature(image_path)
# 2. 插入图片向量和元数据(如图片路径)
collection.insert([[image_vector], [image_path]])
# 3. 检索相似图片
results = collection.search(
data=[image_vector],
anns_field="embedding",
limit=5
)
2. 文本语义搜索
# 1. 使用BERT等模型生成文本向量
text_vector = get_text_embedding("你好,世界")
# 2. 检索相似文本
results = collection.search(
data=[text_vector],
anns_field="embedding",
limit=3,
output_fields=["text"]
)
七、性能优化建议
索引选择:
- 数据量小(百万级以下):FLAT 或 IVF_FLAT
- 高维数据:HNSW
- 超大规模数据:IVF_PQ
参数调优:
- HNSW 的
ef
参数影响召回率和速度(增大ef
提高召回率但降低速度)。 - IVF 的
nprobe
参数需根据数据规模调整(通常为nlist
的 1-5%)。
- HNSW 的
硬件配置:
- 向量检索计算密集,建议使用高性能 CPU(如 Intel Xeon)或 GPU 加速。
- 确保足够内存(至少为索引大小的 1.5 倍)。
八、资源与参考
- 官方文档:https://milvus.io/docs/
- Python SDK 文档:https://pymilvus.readthedocs.io/
- GitHub 仓库:https://github.com/milvus-io/milvus
- 社区论坛:https://discuss.milvus.io/