安装milvus数据库
我使用的是Ubuntu 20.4操作系统,操作系统详细版本如下:
bash
Linux user-SYS-7049GP-TRT 5.15.0-139-generic #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
因为是为了测试开发使用,我使用docker进行安装,更加简单方便,我的服务器上面已经安装了docker。
bash
docker -v
Docker version 28.1.1, build 4eba377
docker-compose -v
docker-compose version 1.25.0, build unknown
从github上下载安装milvus所用的docker-compose.yml:
bash
git clone https://github.com/milvus-io/milvus.git
cd ./milvus/deployments/docker/standalone
打开docker-compose.yml文件,我们会发现milvus数据库依赖其他两个软件minio和etcd。
minio:是一款对象存储文件系统,可以一键安装部署,使用方便。它实现了AWS S3标准接口,其他实现了AWS S3标准的对象存储文件系统,如阿里云OSS等,可以替代此处的minio,milvus也支持使用本地存储。这里依赖minio的原因是milvus本身并不存储向量,而是将向量文件上传到minio中。
etcd:是一个强一致性分布式键值存储系统,在milvus进行生产环境分布式部署有很大作用。etcd 可以对milvus的多个服务组件(QueryNode、DataNode、IndexNode)等进行一致性管理,etcd可以作为注册中心,记录集群拓扑结构和当前分片分布,分布式锁和主节点选举等都会使用到etcd。
启动milvus:
sudo docker-compose up -d
在使用上面命令安装的时候,minio和milvus的镜像因为网络问题,一直无法下载成功,想了个不大方便的法子,现在本地下载成功(本地能够科学上网),然后打包上传到服务器:
bash
# 下载镜像到本地
# 注意一定要加--platform=linux/amd64,不然本地下载的在Ubuntu服务器可能无法使用
# 因为使用的处理器架构可能不同
docker pull minio/minio:RELEASE.2024-05-28T17-19-04Z --platform=linux/amd64
# 在本地将镜像压缩
docker save -o minio_2024-05-28T17-19-04Z.tar minio/minio:RELEASE.2024-05-28T17-19-04Z
# 将tar包上传到服务器后,使用下面的指令加载镜像
docker load -i minio_2024-05-28T17-19-04Z.tar
下面是minio的界面:
连接milvus
这里通过pymilvus库连接milvus数据库。我通过anaconda安装的Python 3.11环境,使用如下代码测试milvus的连接性:
python
from pymilvus import connections
connections.connect("default", host="127.0.0.1", port="19530")
代码执行没有报错,说明连接成功,19530是milvus的默认端口
测试向milvus数据库中写入数据
python
from pymilvus import connections
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection
import random
def create_connection(host='localhost', port='19530'):
connections.connect(alias="default", host=host, port=port)
def create_collection():
# 创建一个表,定义字段, id 和 一个向量
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128),
]
# 定义 schema
schema = CollectionSchema(fields, description="example collection")
# 创建集合
collection = Collection(name="test_collection", schema=schema)
return collection
def insert_data(collection, ids=[1]):
# 一条 ID 和一条 128 维向量
ids = ids
vectors = [[random.random() for _ in range(128)]]
# 插入数据
collection.insert([ids, vectors])
def create_index(collection):
# 创建索引
index_params = {
"metric_type": "L2", # 或者 "IP",L2表示欧几里得距离,通过这个距离表示向量的相似度
"index_type": "IVF_FLAT", # 分桶后线性扫描,搜索快,插入慢
"params": {"nlist": 128}, # 构建时,Milvus 会将所有向量聚类成 nlist 个桶(比如 128 个),这和minio存储有关
}
collection.create_index(field_name="embedding", index_params=index_params)
def search_data(collection):
# 搜索数据
collection.load()
search_params = {
"metric_type": "L2",
"params": {"nprobe": 10} # 搜索时要扫描多少个桶, 推荐值范围:nprobe = nlist * 0.1 ~ 0.5
}
results = collection.search(
# 这里生成一个新的128维度的向量V,查找此时collection中向量V距离最近的向量
data=[[random.random() for _ in range(128)]], # 查询向量
anns_field="embedding", # anns,一种向量搜索方式,近似最近邻搜索,表示在哪个字段中做搜索
param=search_params,
limit=5, # 每个查询向量返回 最相似的前 5 个向量
output_fields=["id"] # 表示返回结果中除了系统的向量距离外,还要包含哪些原始字段
)
for hits in results:
for hit in hits:
print(f"ID: {hit.entity.get('id')}, distance: {hit.distance}")
if __name__ == '__main__':
create_connection()
collection = create_collection()
insert_data(collection, ids=[3])
create_index(collection)
search_data(collection)
输出结果:
python
ID: 4, distance: 17.522409439086914
ID: 1, distance: 19.932241439819336
ID: 3, distance: 19.9774169921875
这输出了几个相似度最高的矩阵。可以看到minio中此时已经有数据:
卸载milvus数据库
我们的milvus数据库是通过docker compose安装的,卸载也很方便:
sudo docker-compose down -v
以上是如何安装milvus数据库以及其简单使用,后面将继续学习分享。