Milvus 向量数据库怎么用:Docker 部署与检索验证
Milvus 是一个开源的向量数据库,主要用来存储和检索高维向量,常见于语义搜索、推荐系统和图片去重等场景。
如果你刚接触 Milvus,最直接的验证方式是先用 Docker 跑起单机版,再通过 Python SDK 完成一次插入和检索。
下面按这个顺序展开,命令和配置可直接复制使用。
跑起来之前先确认环境
单机版 Milvus 依赖 Docker 和 Docker Compose。
在 Linux 服务器或本地开发机上执行:
docker --version
docker compose version
两条命令都能输出版本号即可。
Milvus 单机版默认会启动 etcd、MinIO 和 milvus-standalone 三个容器,需要至少 8GB 内存和 2 核 CPU,磁盘预留 10GB 以上比较稳妥。
如果内存不足,容器可能反复重启,这是新手最容易忽略的前提。
用 Docker Compose 启动单机版
官方提供了单机部署的 compose 文件,直接下载并启动:
wget https://github.com/milvus-io/milvus/releases/download/v2.3.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker compose up -d
启动后检查容器状态:
docker compose ps
看到 milvus-standalone、milvus-etcd、milvus-minio 三个服务状态为 running 或 healthy 就表示正常。
Milvus 对外暴露 19530 端口供 SDK 连接,9091 是健康检查端口。
可以用下面的命令快速验证服务是否响应:
curl http://127.0.0.1:9091/healthz
返回 OK 说明服务已就绪。
如果连接的是远程服务器,记得在防火墙或安全组中放行 19530 端口,否则后续 SDK 会连接超时。
安装 Python SDK 并跑通第一个检索
Milvus 提供 pymilvus 包,安装命令:
pip install pymilvus==2.3.4
版本尽量与 Milvus 服务端主版本保持一致,避免协议不兼容。
下面是一段完整的示例,包含创建集合、插入三条向量、按相似度检索:
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
connections.connect(host="127.0.0.1", port="19530")
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=4),
]
schema = CollectionSchema(fields, description="demo")
collection = Collection(name="demo_collection", schema=schema)
collection.insert([
[1, 2, 3],
[[0.1, 0.2, 0.3, 0.4], [0.2, 0.1, 0.5, 0.3], [0.9, 0.8, 0.7, 0.6]],
])
collection.create_index(field_name="vector", index_params={"index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128}})
collection.load()
res = collection.search(
data=[[0.1, 0.2, 0.3, 0.4]],
anns_field="vector",
param={"metric_type": "L2", "params": {"nprobe": 10}},
limit=2,
)
for hit in res[0]:
print(hit.id, hit.distance)
预期输出会打印两条最相似记录的 id 和距离。dim=4 只是演示用,实际业务中向量维度由你的嵌入模型决定,比如 768 或 1024。
插入数据后必须调用 create_index 和 load 才能检索,这是 Milvus 与普通数据库操作习惯不同的地方。
常见连接与检索报错怎么排查
连接被拒绝或超时:先确认 docker compose ps 中三个容器都在运行,再用 curl http://127.0.0.1:9091/healthz 检查服务端。
远程连接时检查端口是否放行,以及 Python 脚本里的 host 是否填了服务器公网 IP。
报错 collection not loaded:检索前漏掉了 collection.load(),或者集合刚创建索引后需要等待加载完成。
可以在代码中调用 collection.load() 后加一个短暂等待,或者用 utility.load_state() 查看加载状态。
插入维度不一致:检查 FieldSchema 中 dim 是否与插入向量的长度一致,维度不匹配会直接抛异常,不会静默截断。
验证与下一步
跑通示例后,可以打开 Attu(Milvus 的图形化管理工具)查看集合结构和数据量,确认插入与索引是否生效。
后续如果要做批量导入,建议使用 collection.insert 分批提交,避免单次数据过大导致内存压力。
需要提醒的是,单机版适合开发和测试,生产环境通常需要集群部署和更细的资源配置。
如果检索结果不符合预期,优先检查度量类型(L2 与 IP 的选择)和索引参数,而不是盲目重建集合。
常见疑问
Milvus 和普通数据库有什么区别? 普通数据库按字段精确匹配,Milvus 按向量距离找相似项,适合语义层面的模糊匹配。
一定要用 Docker 吗? 不是必须,但 Docker 是官方推荐且最容易复现的方式,手动编译安装的依赖更多,新手不建议一开始就走这条路。
插入数据后为什么搜不到? 最常见原因是集合未加载或索引未创建,按上文顺序检查 create_index 和 load 是否都执行成功。