Milvus 向量數據庫開發實戰指南

Milvus向量數據庫是什么?-CSDN博客

一、核心概念解析

1.1 基礎概念

1.1.1 Bitset(位集)
  • 高效的數據表示方式,使用位數組替代傳統數據類型

  • 默認情況下,位值根據特定條件設置為 0 或 1

1.1.2 通道機制
  • PChannel(物理通道):對應日志存儲主題,系統啟動時分配256個

  • VChannel(邏輯通道):代表集合中的分片,邏輯獨立但物理資源共享

1.1.3 數據組織結構
  • Collection(集合):相當于關系型數據庫中的表

  • Partition(分區):集合的物理劃分,減少讀取負載

  • Segment(段):自動創建的數據文件,分為增長段和封閉段

  • Sharding(分片):基于主鍵哈希的寫入負載分發機制

1.1.4 數據元素
  • Entity(實體):由字段組成的完整數據記錄,具備唯一主鍵

  • Field(字段):支持標量數據(數字、字符串)和向量數據

  • Embedding Vector:非結構化數據的特征抽象表示

1.1.5 系統依賴
  • etcd:元數據存儲

  • MinIO/S3:對象存儲

  • Pulsar:快照日志管理

1.2 向量索引

1.2.1 索引類型
  • 內存索引:提升查詢性能,每個字段支持單一索引類型

  • ANNS索引:近似最近鄰搜索,平衡精度與效率

  • 磁盤索引:需特定硬件和環境支持

1.2.2 索引分類
  • 基于樹的索引

  • 基于圖的索引

  • 基于哈希的索引

  • 基于量化的索引

1.2.3 數據預處理
  • 歸一化處理:將向量轉換為范數為1,使內積等于余弦相似度

  • 非結構化數據處理:通過AI/ML模型轉換為向量表示


二、連接配置

2.1 網絡配置

bash

# 默認端口配置
GRPC_PORT=19530    # SDK連接端口
REST_PORT=9091     # HTTP接口端口

2.2 客戶端連接

java

// 創建連接實例
public MilvusServiceClient createClient(String host, int port) {return new MilvusServiceClient(ConnectParam.newBuilder().withHost(host).withPort(port).build());
}// 連接使用示例
MilvusServiceClient client = createClient("localhost", 19530);// 資源釋放
client.close();

三、集合管理

3.1 集合創建模板

java

public CreateCollectionParam buildCollectionSchema() {// 主鍵字段FieldType idField = FieldType.newBuilder().withName("book_id").withDataType(DataType.Int64).withPrimaryKey(true).withAutoID(false).build();// 標量字段FieldType scalarField = FieldType.newBuilder().withName("word_count").withDataType(DataType.Int64).build();// 向量字段FieldType vectorField = FieldType.newBuilder().withName("book_intro").withDataType(DataType.FloatVector).withDimension(128)  // 根據實際維度調整.build();return CreateCollectionParam.newBuilder().withCollectionName("book").withDescription("圖書向量數據庫").withShardsNum(2).addFieldType(idField).addFieldType(scalarField).addFieldType(vectorField).build();
}

3.2 集合操作工具方法

java

// 檢查集合存在性
public boolean collectionExists(MilvusServiceClient client, String collectionName) {R<Boolean> response = client.hasCollection(HasCollectionParam.newBuilder().withCollectionName(collectionName).build());return response.getData() == Boolean.TRUE;
}// 獲取集合統計信息
public void printCollectionStats(MilvusServiceClient client, String collectionName) {R<GetCollectionStatisticsResponse> response = client.getCollectionStatistics(GetCollectionStatisticsParam.newBuilder().withCollectionName(collectionName).build());GetCollStatResponseWrapper wrapper = new GetCollStatResponseWrapper(response.getData());System.out.println("總記錄數: " + wrapper.getRowCount());
}

四、數據操作

4.1 數據生成與插入

java

public List<InsertParam.Field> generateSampleData(int recordCount, int vectorDimension) {Random random = new Random();// 生成主鍵數據List<Long> ids = new ArrayList<>();for (long i = 0; i < recordCount; i++) {ids.add(i);}// 生成標量數據List<Long> wordCounts = new ArrayList<>();for (int i = 0; i < recordCount; i++) {wordCounts.add(10000L + i);}// 生成向量數據List<List<Float>> vectors = new ArrayList<>();for (int i = 0; i < recordCount; i++) {List<Float> vector = new ArrayList<>();for (int j = 0; j < vectorDimension; j++) {vector.add(random.nextFloat());}vectors.add(vector);}// 構建字段列表List<InsertParam.Field> fields = Arrays.asList(new InsertParam.Field("book_id", DataType.Int64, ids),new InsertParam.Field("word_count", DataType.Int64, wordCounts),new InsertParam.Field("book_intro", DataType.FloatVector, vectors));return fields;
}// 執行數據插入
public void insertData(MilvusServiceClient client, String collectionName, String partitionName, List<InsertParam.Field> fields) {InsertParam insertParam = InsertParam.newBuilder().withCollectionName(collectionName).withPartitionName(partitionName).withFields(fields).build();R<MutationResult> response = client.insert(insertParam);if (response.getStatus() != R.Status.Success.getCode()) {throw new RuntimeException("插入失敗: " + response.getMessage());}
}

4.2 索引管理

java

public void createVectorIndex(MilvusServiceClient client, String collectionName, String fieldName, IndexType indexType, MetricType metricType, String extraParams) {CreateIndexParam indexParam = CreateIndexParam.newBuilder().withCollectionName(collectionName).withFieldName(fieldName).withIndexType(indexType).withMetricType(metricType).withExtraParam(extraParams).withSyncMode(false).build();client.createIndex(indexParam);
}

五、查詢與搜索

5.1 混合搜索實現

java

public SearchResults hybridSearch(MilvusServiceClient client, String collectionName,List<List<Float>> queryVectors, String vectorFieldName,String filterExpr, int topK, String searchParams) {// 確保集合已加載client.loadCollection(LoadCollectionParam.newBuilder().withCollectionName(collectionName).build());SearchParam searchParam = SearchParam.newBuilder().withCollectionName(collectionName).withMetricType(MetricType.L2).withOutFields(Arrays.asList("book_id", "word_count")).withTopK(topK).withVectors(queryVectors).withVectorFieldName(vectorFieldName).withExpr(filterExpr).withParams(searchParams).build();R<SearchResults> response = client.search(searchParam);return response.getData();
}

5.2 向量查詢示例

java

public QueryResults queryByCondition(MilvusServiceClient client, String collectionName,String queryExpr, List<String> outputFields) {QueryParam queryParam = QueryParam.newBuilder().withCollectionName(collectionName).withConsistencyLevel(ConsistencyLevelEnum.STRONG).withExpr(queryExpr).withOutFields(outputFields).withOffset(0L).withLimit(100L).build();R<QueryResults> response = client.query(queryParam);return response.getData();
}

六、最佳實踐

6.1 性能優化建議

  1. 索引選擇:根據數據規模和查詢模式選擇合適的索引類型

  2. 內存管理:控制加載數據量不超過查詢節點總內存的90%

  3. 分區策略:合理使用分區減少讀取負載,分片分散寫入負載

6.2 錯誤處理機制

java

public <T> T executeWithRetry(MilvusOperation<T> operation, int maxRetries) {int attempt = 0;while (attempt < maxRetries) {try {return operation.execute();} catch (Exception e) {attempt++;if (attempt >= maxRetries) {throw new RuntimeException("操作失敗,重試次數耗盡", e);}try {Thread.sleep(1000 * attempt); // 指數退避} catch (InterruptedException ie) {Thread.currentThread().interrupt();throw new RuntimeException("操作被中斷", ie);}}}throw new RuntimeException("未知錯誤");
}interface MilvusOperation<T> {T execute();
}

七、完整示例

7.1 基礎操作流程

java

public class MilvusOperations {private MilvusServiceClient client;private String collectionName = "book";public void fullWorkflow() {// 1. 創建連接client = createClient("localhost", 19530);// 2. 創建集合CreateCollectionParam schema = buildCollectionSchema();client.createCollection(schema);// 3. 插入數據List<InsertParam.Field> data = generateSampleData(1000, 128);insertData(client, collectionName, "novel", data);// 4. 創建索引createVectorIndex(client, collectionName, "book_intro", IndexType.IVF_FLAT, MetricType.L2, "{\"nlist\":1024}");// 5. 執行搜索List<List<Float>> queryVector = Arrays.asList(generateRandomVector(128));SearchResults results = hybridSearch(client, collectionName, queryVector, "book_intro", "word_count <= 11000", 10, "{\"nprobe\":10}");// 6. 資源清理client.releaseCollection(ReleaseCollectionParam.newBuilder().withCollectionName(collectionName).build());client.close();}
}

八、依賴配置

8.1 Maven 配置

xml

<dependencies><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.2.1</version></dependency><!-- 可選:日志框架 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.7</version></dependency>
</dependencies>

8.2 配置建議

  1. 連接池配置:在生產環境中使用連接池管理Milvus連接

  2. 超時設置:根據網絡狀況調整操作超時時間

  3. 監控集成:集成監控系統跟蹤性能指標和錯誤率

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95271.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vcruntime140.dll丟失解決辦法

解決辦法 安裝Microsoft Visual C Redistributable https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?viewmsvc-170

LabVIEW實現跨 VI 簇按鈕控制功能

?在 LabVIEW 開發場景中&#xff0c;常需實現不同 VI 間的交互操作。本功能借助 VI Server 技術&#xff0c;突破 VI 邊界&#xff0c;實現對目標 VI 中簇內按鈕控件的屬性讀取與控制&#xff0c;為多 VI 協同、對VI里已經實現的功能&#xff0c;可以在其他VI中直接使用&#…

JS箭頭函數

JavaScript 的箭頭函數 (Arrow Function) 是 ES6 (ECMAScript 2015) 引入的一種重要的函數語法特性&#xff0c;它用更簡潔的方式定義函數&#xff0c;并改變了 this 的綁定行為。 箭頭函數和傳統函數的主要區別&#xff1a;特性箭頭函數傳統函數語法更簡潔&#xff0c;省略 fu…

linux內核 - 文件系統相關的幾個概念介紹

介紹文件系統之前&#xff0c;先了解下存儲管理的幾個概念&#xff1a;1. 硬盤&#xff1a;是最底層的存儲介質&#xff0c;比如 /dev/sda, /dev/nvme0n1. 一個物理硬盤就是一個塊設備&#xff0c;未經處理是只能順序讀寫二進制數據。 2. 分區&#xff1a;就是在硬盤上劃分出不…

邊緣計算(Edge Computing)+ AI:未來智能世界的核心引擎

邊緣計算&#xff08;Edge Computing&#xff09; AI&#xff1a;未來智能世界的核心引擎 文章目錄邊緣計算&#xff08;Edge Computing&#xff09; AI&#xff1a;未來智能世界的核心引擎摘要什么是邊緣計算&#xff1f;為什么需要邊緣計算&#xff1f;1. 延遲問題2. 帶寬壓力…

計算機視覺與深度學習 | ORB-SLAM3算法原理與Matlab復現指南

文章目錄 一、算法核心原理 1.1 系統架構概述 1.2 數學模型基礎 1.2.1 狀態估計框架 1.2.2 視覺-慣導融合模型 1.3 關鍵創新點 二、關鍵模塊實現細節 2.1 ORB特征提取與匹配 2.2 地圖初始化 2.3 視覺-慣導融合 2.4 回環檢測與優化 三、Matlab復現思路 3.1 系統模塊劃分 3.2 核心…

分布式光伏模式怎么選?從 “憑經驗” 到 “靠數據”,iSolarBP 幫你鎖定最優解

iSolarBP-陽光新能源旗下分布式光伏光儲智能評估設計軟件 iSolarBP是陽光新能源打造的分布式光伏/光儲項目智能設計平臺。提供無人機自動勘測、3D建模、高精度發電仿真、光儲容量優化與經濟分析一站式服務&#xff0c;助力開發者提升效率、降低成本和優化投資收益。https://iso…

MATLAB R2010b系統環境(四)MATLAB幫助系統

一、幫助命令MATLAB幫助命令包括help、lookfor以及模糊查詢。1.1 help命令在命令窗口中直接輸入help或help加函數名。&#xff08;1&#xff09;help&#xff1a;顯示當前幫助系統中所包含的所有項目&#xff0c;即搜索路徑中所有的目錄名稱&#xff0c;如下圖&#xff1a;&…

“便農惠農”智慧社區系統(代碼+數據庫+LW)

摘要 隨著城市化進程加速和信息技術快速發展&#xff0c;傳統社區管理模式已難以滿足現代社區高效管理和居民多元化服務需求。為解決社區管理中的信息孤島問題、提升服務效率并增強居民生活體驗&#xff0c;本文設計并實現了一套基于Spring Boot框架的智慧社區管理系統。該系統…

智慧金融服務平臺問題剖析與改進策略

智慧金融服務平臺問題剖析與改進策略 在數字化浪潮的推動下&#xff0c;智慧金融服務平臺蓬勃發展&#xff0c;為用戶帶來了便捷的金融服務體驗。然而&#xff0c;隨著用戶數量的不斷增加和業務的日益復雜&#xff0c;平臺也暴露出一些問題&#xff0c;其中數據準確性不足、異常…

【Vue2?】Vue2 入門之旅(三):數據與方法

在前兩篇文章中&#xff0c;我們學習了 Vue 的基礎和模板語法。本篇我們將深入 數據與方法&#xff0c;理解 data、methods、computed、watch 的作用和區別。 目錄 datamethodscomputedwatch小結 data Vue 實例中的 data 是數據源&#xff0c;模板會自動響應其中的變化。 &l…

自動化測試時,chrome瀏覽器啟動后閃退的問題

之前運行的好好的&#xff0c;最近再次練習時發現會閃退&#xff0c;然后發現是驅動版本老的問題 &#xff08;1&#xff09;下載與之匹配的驅動器版本 Chrome for Testing availability 找到與Chrome版本前3位相同的目錄&#xff0c;下載對應系統的壓縮包 &#xff08;2&am…

Dynamics 365 XrmToolBox工具之Clone Field Definitions

好久沒有分享XrmToolBox的組件了&#xff0c;今天要分享的是下圖中這個組件在建實體的時候&#xff0c;我們經常會碰到實體間一些字段存在重復&#xff0c;或者都可以直接復制黏貼加一些少量修改就可以生成第二個實體&#xff0c;但如果僅從D365本身來說&#xff0c;要做到復制…

UBUNTU之Onvif開源服務器onvif_srvd:1、編譯

下載源碼 編譯時會下載東西&#xff0c;有可能需要VPN。 https://github.com/KoynovStas/onvif_srvd https://github.com/KoynovStas/onvif_srvd/tags 解壓準備工作 sudo apt install -y flex bison byacc make cmake m4# for support encryption and WS-Security # 在低版…

深度學習跨領域應用探索:從技術落地到行業變革

深度學習不再是實驗室里的 “高精尖技術”&#xff0c;而是滲透到各行各業的 “效率引擎”。它憑借強大的數據擬合與特征提取能力&#xff0c;在計算機視覺、自然語言處理、金融風控等領域打破傳統技術瓶頸&#xff0c;甚至催生出全新的業務模式。本文將深入不同行業場景&#…

計算機網絡:數據庫(sqlite3)

一、常用的數據庫ORACLE&#xff08;大型&#xff09;、Mysal&#xff08;開源常用&#xff09;、SQL server、Access、Sybse、Windows NT二、sqlite3&#xff08;一&#xff09;特性&#xff1a;<1>零配置&#xff0c;無需安裝和配置<2>儲存在單一磁盤文件中的一個…

Web開發:使用Quartz庫結合WebAPI根據任務列表定時執行相應邏輯

一、實體及文件結構public class JobSchedule {public string Id { get; set; }public string Title { get; set; }public string Cron { get; set; } }二、服務類后臺服務類初始化時會調用此類的StartAsync方法public class QuartzService : IQuartzService {private readonly…

數據結構棧的應用

1.棧的應用 后入先出的有序列表//無法進行小數、負數計算&#xff0c;除法計算為在除法步驟時舍棄小數部分public static void main(String[] args) {//雙棧實現計算器功能,思路//1.定義數棧1、符號棧2、掃描指針index&#xff0c;從前往后掃描表達式序列//2.遇到數字&#xff…

npm 打包上傳命令,撤銷錯誤版本

添加npm用戶賬號npm adduser上傳包命令npm publish撤銷錯誤版本example&#xff1a;npm unpublish longze-guide0.1.0 --forcepackage.json example{"name": "longze-guide","version": "0.1.1","private": false,"des…

Python爬蟲實戰:研究Pyplot模塊,構建IMDb數據采集和分析系統

1. 引言 1.1 研究背景 在大數據時代,互聯網蘊含著海量有價值的信息,如何高效獲取并分析這些信息成為各行各業的重要需求。網絡爬蟲作為一種自動化數據采集工具,能夠按照預定規則從網頁中提取所需信息,為數據分析提供基礎數據支撐。而數據可視化則是將抽象數據轉化為直觀圖…