DataWhale共学-向量数据库task03-Milvus Lite部署与应用教程

207 阅读2分钟

创建环境


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的版本号

image.png

创建数据库
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])>

image.png

修改后创建db成功

image.png

向量数据库基本概念

概念描述
数据库(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']

image.png

插入数据

创建一个小的向量集合(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) #查看插入的数据

写入的是向量

image.png

数据查询

向量相似查询

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)

image.png

这里返回的是对应的向量id和距离

image.png