创建环境
conda create -n milvus python=3.12 -y
-n py312:指定环境名称为py312(可根据需要修改)
python=3.12:指定 Python 版本为 3.12
conda activate milvus
注册内核
pip install ipykernel
注册内核
python -m ipykernel install --user --name milvus
安装 Milvus
pip install -U pymilvus # 包含Milvus Lite
验证安装
import pymilvus
print(pymilvus.__version__) # 应输出类似2.5.8的版本号
创建数据库
from pymilvus import MilvusClient
# 创建本地数据库文件(自动生成)
client = MilvusClient("./milvus_demo.db") # 文件路径可自定义
报错:
ConnectionConfigException: <ConnectionConfigException: (code=1, message=milvus-lite is required for local database connections. Please install it with: pip install pymilvus[milvus_lite])>
修改后创建db成功
向量数据库基本概念
| 概念 | 描述 |
|---|---|
| 数据库(Database) | 类似与MySQL的database,首先需要一个库 |
| 集合 (Collection) | 集合类似于MySQL中的表,它是用来存储向量的容器。集合可以有多个字段,每个字段对应一个向量属性。 |
| 向量 (Vector) | 向量是多维空间中的点,通常用于表示数据的特征,是集合中的基本存储单元。 |
| 索引 (Index) | 索引是用来加速向量搜索的数据结构,有多种索引类型,如 FLAT、IVF、HNSW 等,各自都有特定的适用场景。 |
| Field | 字段,可以是结构化数据、向量; |
| Entity | 一组Filed,类似表的一条记录。 |
创建集合
# 创建集合,重复运行,不会反复创建集合。
client.create_collection(
collection_name="test_collection", # 集合名称
dimension=2048 # 向量的维度,这里的维度,关系到后面添加的向量数据的维度
)
print(client.list_collections())
#['test_collection']
插入数据
创建一个小的向量集合(Collection)
client.create_collection(
collection_name="test", # 集合的名称
dimension=5, # 向量的维度
primary_field_name="id", # 主键字段名称
id_type="int", # 主键的类型
vector_field_name="vector", # 向量字段的名称
metric_type="L2", # 指标类型,用于测量向量嵌入之间的相似性的算法。
auto_id=True # 主键ID自动递增
)
insert 写入数据:
# 写入一条
res1 = client.insert(
collection_name="test", # 前面创建的 collection 名称
data={
"id": 0, # 主键ID
"vector": [ # 向量
0.1,
0.2,
0.3,
0.4,
0.5
],
"name": "测试1" # 其他字段
}
)
# 查看插入的数据
result = client.query(collection_name="test", filter="", output_fields=["*"],limit=100)
print(len(result)) #查看条数
print(result) #查看插入的数据
写入的是向量
数据查询
向量相似查询
res = client.search(
collection_name="test",
data=[[0.05, 0.23, 0.07, 0.45, 0.13]],
limit=3,
search_params={
"metric_type": "L2",
"params": {}
}
)
for row in res[0]:
print(row)
向量相似查询 + 过滤
res = client.search(
collection_name="test",
data=[[0.05, 0.23, 0.07, 0.45, 0.13]],
limit=3,
filter='name LIKE "%测试%"'
)
for row in res[0]:
print(row)
query 普通查询数据
res = client.query(
collection_name="test1",
filter="id > 1",
limit=3,
output_fields=["*"]
)
for row in res:
print(row)
upsert 插入或更新数据
## 查询 name = '测试1' 的数据
res = client.query(
collection_name="test",
filter="name == '测试1'",
output_fields=["*"]
)
row = res[0]
print(row)
# 修改name为datawhale
row['name'] = "datawhale"
# 保存修改
client.upsert(
collection_name="test",
data=[row]
)
查询数据
res = client.query(
collection_name="test",
filter="name == 'datawhale'",
output_fields=["*"],
limit=10
)
for row in res:
print(row)
这里返回的是对应的向量id和距离