基于Python的Milvus完整使用實(shí)戰(zhàn)案例
這份教程是Milvus 2.4.x + Python的開箱即用實(shí)戰(zhàn)案例,覆蓋連接服務(wù)、創(chuàng)建集合、建索引、插入數(shù)據(jù)、向量檢索、混合檢索、數(shù)據(jù)管理全流程,適合新手快速上手。
一、環(huán)境準(zhǔn)備
1. 啟動(dòng)Milvus服務(wù)
推薦用Docker一鍵啟動(dòng)(最簡(jiǎn)單,無需復(fù)雜配置):
# 下載Milvus 2.4.x 配置文件 wget https://github.com/milvus-io/milvus/releases/download/v2.4.4/milvus-standalone-docker-compose.yml -O docker-compose.yml # 啟動(dòng)服務(wù) docker-compose up -d
啟動(dòng)后,Milvus默認(rèn)地址:localhost:19530
2. 安裝Python客戶端
pip install pymilvus>=2.4.0 # 安裝官方Python SDK pip install numpy # 用于生成模擬向量
二、完整實(shí)戰(zhàn)代碼
核心場(chǎng)景:向量數(shù)據(jù)庫的基礎(chǔ)CRUD + 相似度檢索(模擬文本/圖像特征向量存儲(chǔ)與搜索)
# 1. 導(dǎo)入依賴包
from pymilvus import (
connections, # 連接Milvus
Collection, # 集合操作
FieldSchema, # 字段定義
CollectionSchema, # 集合結(jié)構(gòu)
DataType, # 數(shù)據(jù)類型
utility # 工具函數(shù)(檢查集合、刪除集合等)
)
import numpy as np
# ====================== 2. 連接Milvus服務(wù) ======================
# 默認(rèn)連接本地Milvus,參數(shù):host(地址)、port(端口)、alias(連接別名)
connections.connect(
alias="default",
host="localhost",
port="19530"
)
print("? 成功連接Milvus服務(wù)")
# ====================== 3. 定義集合結(jié)構(gòu)(Schema) ======================
# 集合 = 表,字段 = 列,必須包含:主鍵字段 + 向量字段
# 字段1:主鍵ID(自增整數(shù),唯一標(biāo)識(shí))
primary_field = FieldSchema(
name="id",
dtype=DataType.INT64,
is_primary=True, # 主鍵
auto_id=True # 自動(dòng)生成ID,無需手動(dòng)插入
)
# 字段2:向量字段(核心!存儲(chǔ)特征向量,512維)
vector_field = FieldSchema(
name="embedding",
dtype=DataType.FLOAT_VECTOR,
dim=512 # 向量維度:必須和你的數(shù)據(jù)一致
)
# 字段3:標(biāo)量字段(輔助過濾,比如分類標(biāo)簽)
tag_field = FieldSchema(
name="tag",
dtype=DataType.INT64
)
# 定義集合整體結(jié)構(gòu)
schema = CollectionSchema(
fields=[primary_field, vector_field, tag_field],
description="Milvus基礎(chǔ)案例:特征向量存儲(chǔ)與檢索"
)
# ====================== 4. 創(chuàng)建集合 ======================
collection_name = "milvus_demo"
# 如果集合已存在,先刪除(避免重復(fù)創(chuàng)建報(bào)錯(cuò))
if utility.has_collection(collection_name):
utility.drop_collection(collection_name)
# 創(chuàng)建集合
collection = Collection(
name=collection_name,
schema=schema,
using="default" # 使用默認(rèn)連接
)
print(f"? 成功創(chuàng)建集合:{collection_name}")
# ====================== 5. 創(chuàng)建向量索引(必須?。?======================
# Milvus必須建索引才能檢索,索引決定檢索速度和精度
# 入門推薦:IVF_FLAT(平衡速度和精度)
index_params = {
"index_type": "IVF_FLAT", # 索引類型
"metric_type": "L2", # 相似度計(jì)算方式:L2(歐氏距離)、IP(內(nèi)積)、COSINE(余弦)
"params": {"nlist": 128} # 索引參數(shù)(聚類數(shù)量)
}
# 為向量字段創(chuàng)建索引
collection.create_index(
field_name="embedding",
index_params=index_params
)
print("? 成功創(chuàng)建向量索引")
# ====================== 6. 加載集合到內(nèi)存(必須?。?======================
# 集合創(chuàng)建后默認(rèn)在磁盤,必須加載到內(nèi)存才能讀寫
collection.load()
print("? 集合已加載到內(nèi)存")
# ====================== 7. 插入模擬數(shù)據(jù) ======================
# 生成1000條512維隨機(jī)向量(模擬文本/圖像特征)
num_entities = 1000
vectors = np.random.rand(num_entities, 512).tolist() # 轉(zhuǎn)列表格式
# 生成標(biāo)量標(biāo)簽(0-9隨機(jī)分類)
tags = np.random.randint(0, 10, num_entities).tolist()
# 插入數(shù)據(jù):字段順序和Schema定義一致
insert_result = collection.insert(
data=[vectors, tags] # 自動(dòng)填充主鍵(auto_id=True)
)
print(f"? 成功插入 {num_entities} 條數(shù)據(jù),主鍵ID:{insert_result.ids[:5]}...")
# 刷新數(shù)據(jù)(確保插入后立即可檢索)
collection.flush()
# ====================== 8. 核心功能:向量相似度檢索 ======================
# 生成1條查詢向量(和插入數(shù)據(jù)同維度)
search_vector = np.random.rand(1, 512).tolist()
# 檢索參數(shù)
search_params = {
"metric_type": "L2",
"params": {"nprobe": 10} # 檢索精度:值越大越準(zhǔn),速度越慢
}
# 執(zhí)行檢索
results = collection.search(
data=search_vector, # 查詢向量
anns_field="embedding", # 要檢索的向量字段
param=search_params, # 檢索參數(shù)
limit=5, # 返回Top5最相似的結(jié)果
output_fields=["id", "tag"]# 同時(shí)返回的標(biāo)量字段
)
# 打印檢索結(jié)果
print("\n?? 向量相似度檢索結(jié)果(Top5):")
for hits in results:
for hit in hits:
print(f"ID: {hit.id}, 相似度距離: {hit.distance:.4f}, 標(biāo)簽: {hit.entity.get('tag')}")
# ====================== 9. 進(jìn)階:標(biāo)量過濾 + 向量檢索 ======================
# 場(chǎng)景:只檢索【標(biāo)簽=3】的向量中,最相似的Top3
filtered_results = collection.search(
data=search_vector,
anns_field="embedding",
param=search_params,
limit=3,
expr="tag == 3", # 標(biāo)量過濾條件(SQL風(fēng)格)
output_fields=["id", "tag"]
)
print("\n?? 過濾后檢索結(jié)果(tag=3,Top3):")
for hits in filtered_results:
for hit in hits:
print(f"ID: {hit.id}, 相似度距離: {hit.distance:.4f}, 標(biāo)簽: {hit.entity.get('tag')}")
# ====================== 10. 數(shù)據(jù)管理 ======================
# 1. 刪除數(shù)據(jù)(根據(jù)主鍵ID)
if len(insert_result.ids) > 0:
del_id = insert_result.ids[0]
collection.delete(expr=f"id == {del_id}")
print(f"\n? 成功刪除ID={del_id}的數(shù)據(jù)")
# 2. 釋放集合(從內(nèi)存卸載)
collection.release()
print("? 集合已從內(nèi)存釋放")
# 3. 刪除集合(清空所有數(shù)據(jù))
# utility.drop_collection(collection_name)
# print("? 已刪除集合")
# ====================== 11. 斷開連接 ======================
connections.disconnect("default")
print("\n? 已斷開Milvus連接")三、關(guān)鍵知識(shí)點(diǎn)解釋
1. 核心概念
| 概念 | 解釋 |
|---|---|
| 集合(Collection) | 相當(dāng)于關(guān)系型數(shù)據(jù)庫的表,用于存儲(chǔ)向量數(shù)據(jù) |
| 向量字段 | 存儲(chǔ)特征向量(文本/圖像/音頻的數(shù)字化特征) |
| 索引 | 加速向量檢索的核心,無索引無法檢索 |
| 相似度計(jì)算 | L2(歐氏距離,越小越相似)、IP(內(nèi)積,越大越相似)、COSINE(余弦相似度) |
2. 必做操作
- 連接Milvus后才能操作
- 向量字段必須建索引
- 集合必須加載到內(nèi)存才能讀寫
- 檢索前建議
flush()刷新數(shù)據(jù)
3. 檢索參數(shù)說明
nprobe:檢索精度,10-100 之間調(diào)整,越大越準(zhǔn)、速度越慢limit:返回最相似的TopN結(jié)果expr:標(biāo)量過濾,支持==、>、<、and、or等條件
四、常見問題
- 連接失敗:檢查Milvus服務(wù)是否啟動(dòng)(
docker ps查看容器) - 維度不匹配:插入向量的
dim必須和Schema定義一致 - 檢索報(bào)錯(cuò):未建索引/未加載集合到內(nèi)存
- 數(shù)據(jù)不顯示:插入后未執(zhí)行
flush()刷新
總結(jié)
- 本案例覆蓋Milvus Python客戶端全流程操作,可直接復(fù)制運(yùn)行
- 核心能力是向量相似度檢索,適用于AI大模型、圖像搜索、推薦系統(tǒng)等場(chǎng)景
- 入門優(yōu)先用
IVF_FLAT索引+L2相似度,后續(xù)可根據(jù)業(yè)務(wù)優(yōu)化索引類型
到此這篇關(guān)于基于Python的Milvus完整使用案例的文章就介紹到這了,更多相關(guān)Python Milvus使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實(shí)現(xiàn)Office文檔(Word/Excel/PowerPoint)批量轉(zhuǎn)換為PDF
在處理不同格式的Office文檔(如Word、Excel和PowerPoint)時(shí),將其轉(zhuǎn)換為PDF格式是常見的需求,本文就跟隨小編來看看如何使用Python將Word/Excel/PowerPoint批量轉(zhuǎn)換為PDF吧2024-10-10
django admin 自定義替換change頁面模板的方法
今天小編就為大家分享一篇django admin 自定義替換change頁面模板的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python?中?lxml?的?etree?標(biāo)簽解析
這篇文章主要介紹了python?中l(wèi)xml的etree?標(biāo)簽解析,文章圍繞主題展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助2022-04-04
1行代碼搞定Python中的高頻數(shù)據(jù)處理場(chǎng)景
本文介紹了使用Python和Pandas庫進(jìn)行高效數(shù)據(jù)處理的技巧,通過一行代碼即可完成90%的日常數(shù)據(jù)處理需求,內(nèi)容涵蓋數(shù)據(jù)加載、清洗、轉(zhuǎn)換、統(tǒng)計(jì)分析和導(dǎo)出全流程,希望對(duì)大家有所幫助2026-04-04

