milvus安装

官网教程:https://www.milvus.io/cn/docs/install_milvus.md

我是在win10下安装的docker版,先安装docker,百度点点点即可,配置环境时需要内存8G往上;
再在docker上找到镜像pull下来

docker pull milvusdb/milvus:cpu-latest

完成后运行

docker run -it -p 19530:19530 -d milvusdb/milvus:cpu-latest

查看一下是否在运行了,ok了就可以开始玩耍了

docker ps

本地的python需要先安装pymilvus

pip install pymilvus

基础操作

连接milvus

port对应容器运行时设置的

from milvus import Milvus, IndexType, MetricType
milvus = Milvus(host='localhost', port='19530')
建立/删除collection

collection相当于一个数据库中的表
index_file_size:缓存大小,默认1024M
metric_type:距离的计算方式,L2为欧氏距离;此外还有Jaccard相似系数:MetricType.JACCARD,汉明距离:MetricType.HAMMING等等,可以在MetricType下找找其他的。

vec_dim = 998#向量的维度
num_vec=9999 #向量数量10000,后面还加入了一条和查询向量一样的做验证
param = {'collection_name':'test01', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.L2}
milvus.create_collection(param) 
#像数据库一样为表test01建立分区tag01
milvus.create_partition('test01', 'tag01')
milvus.drop_collection('test01')
建立索引

不写的话默认方式为IndexType.FLAT只能精确查找,速度会慢些;
IVF_FLAT的意思是先进行聚类,nlist控制聚类簇数,查询的时候先与各个簇中心进行计算距离,选近的n个再进行簇内查询。

ivf_param = {'nlist': 16}
milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param) 
插入向量

插入的向量形式需要是list;
单次插入的数据量不能大于 256 MB,插入后存在缓存区,缓存区大小由参数index_file_size决定,默认1024M

vectors_array = np.random.rand(num_vec,vec_dim)
vectors_list = vectors_array.tolist()
vectors_list.append([1 for _ in range(vec_dim)])
milvus.insert(collection_name='test01', records=vectors_list, partition_tag="tag01")

此时查看collection已经有了

print(milvus.list_collections())

但是直接去查询,可能会出来空值,因为数据还在缓存区,需要手动将它落盘

milvus.flush(collection_name_array=['test01'])
查询

nprobe:表示查询的簇的数量,就是查询最近的nprobe个簇内的所有数据

query_vec_list = [[1 for _ in range(vec_dim)]]
search_param = {'nprobe': 10}
results = milvus.search(collection_name='test01', query_records=query_vec_list, top_k=10,params=search_param)
完整代码
# -*- coding: utf-8 -*-
#docker run  -it -p 19530:19530 -d milvusdb/milvus:cpu-latest
#导入相应的包
import numpy as np
from milvus import Milvus, IndexType, MetricType
import time

t1 = time.time()
# 初始化一个Milvus类,以后所有的操作都是通过milvus来的
milvus = Milvus(host='localhost', port='19530')
vec_dim = 1000 #向量的维度
num_vec=9999 #向量数量10000,后面还加入了一条和查询向量一样的做验证
#删除collection
milvus.drop_collection('test01')
#创建collection
param = {'collection_name':'test01', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.L2}
milvus.create_collection(param)
#建立分区
milvus.create_partition('test01', 'tag01')

#nlist聚类为多少簇
ivf_param = {'nlist': 16}
milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param) #可以不写这个,默认方式IndexType.FLAT
# 随机生成一批向量数据
vectors_array = np.random.rand(num_vec,vec_dim)
vectors_list = vectors_array.tolist()
vectors_list.append([1 for _ in range(vec_dim)])
#单次插入的数据量不能大于 256 MB,插入后存在缓存区,缓存区大小由参数index_file_size决定,默认1024M
milvus.insert(collection_name='test01', records=vectors_list, partition_tag="tag01")
#一些信息
print(milvus.list_collections())
print(milvus.get_collection_info('test01'))
t2 = time.time()
print("create cost:",t2-t1)
# # 创建查询向量
query_vec_list = [[1 for _ in range(vec_dim)]]
# 进行查询, 注意这里的参数nprobe和建立索引时的参数nlist 会因为索引类型不同而影响到查询性能和查询准确率
#IVF_FLAT下查询多少个簇,不能超过nlist
search_param = {'nprobe': 10}
#现在数据还在内存,需要数据落盘,保存到数据库中去,不然查不到数据
milvus.flush(collection_name_array=['test01'])
results = milvus.search(collection_name='test01', query_records=query_vec_list, top_k=10,params=search_param)
print(results)
print("search cost:",time.time()-t2)

GitHub 加速计划 / mi / milvus
28.68 K
2.76 K
下载
A cloud-native vector database, storage for next generation AI applications
最近提交(Master分支:1 个月前 )
89397d1e #36252 remove no need type check. if users use null type writer to write parquet, hope it successfully. Signed-off-by: lixinguo <xinguo.li@zilliz.com> Co-authored-by: lixinguo <xinguo.li@zilliz.com> 12 小时前
e84c4f2a #36003 Signed-off-by: lixinguo <xinguo.li@zilliz.com> Co-authored-by: lixinguo <xinguo.li@zilliz.com> 13 小时前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐