Milvus 的基本使用流程和核心操作指南

发布于:2025-08-04 ⋅ 阅读:(20) ⋅ 点赞:(0)

以下是 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"]
)

七、性能优化建议

  1. 索引选择

    • 数据量小(百万级以下):FLAT 或 IVF_FLAT
    • 高维数据:HNSW
    • 超大规模数据:IVF_PQ
  2. 参数调优

    • HNSW 的 ef 参数影响召回率和速度(增大 ef 提高召回率但降低速度)。
    • IVF 的 nprobe 参数需根据数据规模调整(通常为 nlist 的 1-5%)。
  3. 硬件配置

    • 向量检索计算密集,建议使用高性能 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/

网站公告

今日签到

点亮在社区的每一天
去签到