pymilvus基操

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)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用异步编程来实现 pymilvus 的读写操作。在 Python 中,可以使用 asyncio 库来实现异步操作。首先,您需要将您的读写操作封装在异步函数中,并使用 `await` 关键字来等待异步调用的结果。接下来,您可以使用 `asyncio.run()` 函数来运行异步函数。 以下是一个示例代码,演示了如何使用异步方式进行 pymilvus 的读写操作: ```python import asyncio from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection async def main(): # 建立 Milvus 连接 connections.connect(host='localhost', port='19530') # 定义集合模式 fields = [ FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, dim=128), FieldSchema(name='timestamp', dtype=DataType.INT64) ] schema = CollectionSchema(fields=fields, description='My collection schema') # 异步创建集合 collection = await Collection.create(collection_name='my_collection', schema=schema) # 异步插入数据 embeddings = [[0.1] * 128, [0.2] * 128] timestamps = [1623136800, 1623136900] ids = await collection.insert(embedding=embeddings, timestamp=timestamps) # 异步查询数据 query_embeddings = [[0.3] * 128] results = await collection.search(query_embedding=query_embeddings, top_k=10) # 输出结果 print(results) # 异步删除集合 await collection.drop() # 断开 Milvus 连接 connections.disconnect() # 运行异步函数 asyncio.run(main()) ``` 请注意,您需要在代码中合适的位置使用 `await` 关键字来等待异步调用完成,以便实现异步读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值