最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

30分鐘教你上手用Java快速搭建你的第一個向量數(shù)據(jù)庫

 更新時間:2026年04月29日 09:10:43   作者:canjun_wen  
在?AI?大爆發(fā)的時代,向量數(shù)據(jù)庫成為連接原始數(shù)據(jù)與大模型的核心樞紐,如果你是?Java?開發(fā)者,想快速搭上向量數(shù)據(jù)庫的快車,這篇實操指南就是為你準備的,全程無需復雜環(huán)境配置,30?分鐘內帶你從?0?到?1?搭建可運行的向量數(shù)據(jù)庫應用

在 AI 大爆發(fā)的時代,向量數(shù)據(jù)庫成為連接原始數(shù)據(jù)與大模型的核心樞紐——它能高效存儲、檢索“向量化”的文本、圖片等數(shù)據(jù),為語義搜索、智能推薦等場景提供底層支撐。如果你是 Java 開發(fā)者,想快速搭上向量數(shù)據(jù)庫的快車,這篇實操指南就是為你準備的。全程無需復雜環(huán)境配置,30 分鐘內帶你從 0 到 1 搭建可運行的向量數(shù)據(jù)庫應用。

一、先搞懂核心問題:什么是向量數(shù)據(jù)庫?

在動手前,我們先花 2 分鐘理清核心概念,避免“知其然不知其所以然”。

傳統(tǒng)數(shù)據(jù)庫(如 MySQL)靠“精確匹配”查詢數(shù)據(jù)(比如搜索“蘋果手機”就只能找到含這五個字的結果),而向量數(shù)據(jù)庫存儲的是“向量”——一種將非結構化數(shù)據(jù)(文本、圖片等)通過模型轉化成的多維數(shù)值數(shù)組。比如“貓喜歡吃魚”和“貓咪愛吃小魚干”,轉化后的向量會非常接近。

向量數(shù)據(jù)庫的核心能力是“近似最近鄰搜索(ANN)”,能快速找到與目標向量最相似的數(shù)據(jù),這正是 AI 場景需要的“語義理解”能力。

本次實操 我們選用 Milvus Lite(Milvus 向量數(shù)據(jù)庫的輕量版),它無需部署獨立服務,直接嵌入 Java 應用,對新手極度友好;配合 Java SDK 就能快速開發(fā),完美契合“快速上手”的需求。

二、環(huán)境準備:3 分鐘搞定依賴與配置

工欲善其事,必先利其器。確保你的環(huán)境滿足基礎要求,然后快速完成配置。

1. 基礎環(huán)境要求

  • JDK 8 及以上(推薦 JDK 11,兼容性更好)
  • Maven 3.6+(用于依賴管理,也可用 Gradle)
  • 開發(fā)工具:IDEA 或 Eclipse(本次以 IDEA 為例)

2. 新建 Maven 項目并添加依賴

打開 IDEA,新建一個普通 Maven 項目(GroupId、ArtifactId 自定義即可),然后在 pom.xml 中添加以下依賴:

<dependencies>
    <dependency>
        <groupId>io.milvus</groupId>
        <artifactId>milvus-sdk-java</artifactId>
        <version>2.4.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>2.0.9</version>
    </dependency>
</dependencies>

點擊 Maven 刷新按鈕,等待依賴下載完成。Milvus Lite 會隨 SDK 自動引入,無需額外安裝服務,這也是我們選它的核心原因。

三、核心步驟:20 分鐘完成“建庫-插數(shù)-查詢”全流程

向量數(shù)據(jù)庫的核心操作流程是“連接數(shù)據(jù)庫 → 創(chuàng)建集合(類似傳統(tǒng)數(shù)據(jù)庫的表) → 插入向量數(shù)據(jù) → 執(zhí)行相似度查詢”。我們一步步拆解實現(xiàn)。

1. 第一步:連接 Milvus Lite 數(shù)據(jù)庫

新建一個 VectorDbDemo.java 類,首先實現(xiàn)數(shù)據(jù)庫連接。Milvus Lite 以本地文件形式存儲數(shù)據(jù),連接時只需指定數(shù)據(jù)存儲路徑即可。

import io.milvus.client.MilvusClient;
import io.milvus.param.ConnectParam;
import io.milvus.param.MilvusClientParam;
import io.milvus.param.R;
import io.milvus.param.collection.CreateCollectionParam;
import io.milvus.param.collection.FieldType;
import io.milvus.param.dml.InsertParam;
import io.milvus.param.dml.SearchParam;
import io.milvus.response.InsertResponse;
import io.milvus.response.SearchResponse;
import org.apache.commons.lang3.RandomUtils;

import java.util.ArrayList;
import java.util.List;

public class VectorDbDemo {
    // Milvus Lite 數(shù)據(jù)庫連接地址(本地文件路徑,自定義)
    private static final String MILVUS_URL = "localhost:19530";
    // 集合名稱(類似表名,自定義)
    private static final String COLLECTION_NAME = "java_vector_demo";
    // 向量維度(需與生成的向量維度一致,這里選128維)
    private static final int VECTOR_DIM = 128;

    public static void main(String[] args) {
        // 1. 構建連接參數(shù)
        ConnectParam connectParam = ConnectParam.newBuilder()
                .withHost("localhost")
                .withPort(19530)
                .build();

        // 2. 創(chuàng)建 Milvus 客戶端
        MilvusClient client = new MilvusClient(connectParam);

        // 測試連接是否成功
        R<Boolean> healthCheck = client.checkHealth();
        if (healthCheck.getData()) {
            System.out.println("? 數(shù)據(jù)庫連接成功!");
        } else {
            System.out.println("? 數(shù)據(jù)庫連接失敗:" + healthCheck.getMessage());
            return;
        }

        // 后續(xù)操作(創(chuàng)建集合、插數(shù)、查詢)將在這里補充
    }
}

運行 main 方法,如果控制臺輸出“? 數(shù)據(jù)庫連接成功!”,說明基礎連接已打通。Milvus Lite 會自動在本地啟動臨時服務,退出程序后服務停止,數(shù)據(jù)會保存在默認路徑。

2. 第二步:創(chuàng)建集合(定義數(shù)據(jù)結構)

集合是向量數(shù)據(jù)庫存儲數(shù)據(jù)的基本單元,類似 MySQL 的表。我們需要定義集合的字段,核心包含“主鍵字段”和“向量字段”,還可以添加“普通屬性字段”(如文本原文)。

在連接成功后,添加創(chuàng)建集合的代碼:

// 3. 創(chuàng)建集合(先判斷是否存在,存在則刪除)
if (client.hasCollection(COLLECTION_NAME).getData()) {
    client.dropCollection(COLLECTION_NAME);
    System.out.println("??  集合已存在,已刪除");
}

// 定義字段:主鍵字段(自增ID)
FieldType idField = FieldType.newBuilder()
        .withName("id")
        .withDataType(FieldType.DataType.Int64)
        .withPrimaryKey(true)
        .withAutoID(true) // 自增
        .build();

// 定義字段:向量字段(核心)
FieldType vectorField = FieldType.newBuilder()
        .withName("content_vector")
        .withDataType(FieldType.DataType.FloatVector)
        .withDimension(VECTOR_DIM) // 向量維度與生成的一致
        .build();

// 定義字段:普通屬性字段(存儲文本原文,方便查詢后展示)
FieldType textField = FieldType.newBuilder()
        .withName("text_content")
        .withDataType(FieldType.DataType.VarChar)
        .withMaxLength(512) // 文本最大長度
        .build();

// 構建創(chuàng)建集合的參數(shù)
CreateCollectionParam createParam = CreateCollectionParam.newBuilder()
        .withCollectionName(COLLECTION_NAME)
        .addFieldType(idField)
        .addFieldType(vectorField)
        .addFieldType(textField)
        .withConsistencyLevel(CreateCollectionParam.ConsistencyLevelEnum.STRONG) // 一致性級別
        .build();

// 執(zhí)行創(chuàng)建集合
R<Boolean> createResult = client.createCollection(createParam);
if (createResult.getData()) {
    System.out.println("? 集合創(chuàng)建成功!");
} else {
    System.out.println("? 集合創(chuàng)建失?。? + createResult.getMessage());
    client.close();
    return;
}

這里我們定義了三個字段:id(自增主鍵)、content_vector(128維向量字段,核心)、text_content(存儲原始文本,方便結果展示)。執(zhí)行后控制臺會輸出“? 集合創(chuàng)建成功!”。

3. 第三步:生成向量并插入數(shù)據(jù)

向量數(shù)據(jù)庫存儲的是向量,所以我們需要先將原始文本轉化為向量。實際開發(fā)中會用專業(yè)模型(如 BERT、Sentence-BERT)生成向量,為了簡化演示,這里用隨機數(shù)模擬向量(后續(xù)會說明如何替換為真實模型)。

在集合創(chuàng)建成功后,添加“生成向量+插入數(shù)據(jù)”的代碼:

// 4. 生成測試數(shù)據(jù)(5條文本,模擬用戶問答場景)
List<String> textList = new ArrayList<>();
textList.add("Java 中如何創(chuàng)建線程?有幾種方式?");
textList.add("Java 線程的生命周期包括哪些狀態(tài)?");
textList.add("Spring Boot 如何配置數(shù)據(jù)庫連接池?");
textList.add("Spring Cloud 與 Spring Boot 的區(qū)別是什么?");
textList.add("Java 8 的 Lambda 表達式有什么用法?");

// 生成向量:將每條文本轉化為128維向量(模擬,實際用模型生成)
List<List<Float>> vectorList = new ArrayList<>();
for (int i = 0; i < textList.size(); i++) {
    List<Float> vector = new ArrayList<>();
    for (int j = 0; j < VECTOR_DIM; j++) {
        // 用隨機數(shù)模擬向量(真實場景替換為模型輸出)
        vector.add(RandomUtils.nextFloat(0.0f, 1.0f));
    }
    vectorList.add(vector);
}

// 構建插入?yún)?shù)
InsertParam insertParam = InsertParam.newBuilder()
        .withCollectionName(COLLECTION_NAME)
        .addField("text_content", textList) // 插入文本字段
        .addField("content_vector", vectorList) // 插入向量字段
        .build();

// 執(zhí)行插入
R<InsertResponse> insertResult = client.insert(insertParam);
if (insertResult.getData() != null) {
    System.out.println("? 數(shù)據(jù)插入成功!插入條數(shù):" + textList.size());
    System.out.println("插入數(shù)據(jù)ID:" + insertResult.getData().getInsertIds());
} else {
    System.out.println("? 數(shù)據(jù)插入失敗:" + insertResult.getMessage());
    client.close();
    return;
}

這里我們模擬了 5 條 Java 開發(fā)相關的文本數(shù)據(jù),并用隨機數(shù)生成對應向量。執(zhí)行后控制臺會輸出插入成功的提示和數(shù)據(jù) ID,說明數(shù)據(jù)已存入向量數(shù)據(jù)庫。

真實場景向量生成:如果需要生成有語義意義的向量,可引入 sentence-transformers 等模型(Java 可通過 JNA 調用或使用國內開源模型如 ERNIE),核心是將文本轉化為固定維度的浮點數(shù)數(shù)組,維度需與集合定義的 VECTOR_DIM 一致。

4. 第四步:創(chuàng)建索引并執(zhí)行相似度查詢

向量數(shù)據(jù)庫的查詢依賴“索引”來提升效率,沒有索引時會執(zhí)行全量掃描,速度較慢。我們先創(chuàng)建向量索引,再執(zhí)行相似度查詢。

在數(shù)據(jù)插入成功后,添加以下代碼:

// 5. 創(chuàng)建向量索引(提升查詢效率)
// 索引參數(shù)(IVF_FLAT 是基礎索引類型,適合小數(shù)據(jù)量)
String indexParam = String.format("{\"index_type\": \"IVF_FLAT\", \"params\": {\"nlist\": 1024}, \"metric_type\": \"L2\"}");
R<Boolean> createIndexResult = client.createIndex(
        COLLECTION_NAME,
        "content_vector", // 向量字段名
        indexParam
);
if (createIndexResult.getData()) {
    System.out.println("? 向量索引創(chuàng)建成功!");
} else {
    System.out.println("? 索引創(chuàng)建失敗:" + createIndexResult.getMessage());
    client.close();
    return;
}

// 6. 加載集合到內存(查詢前必須執(zhí)行)
R<Boolean> loadResult = client.loadCollection(COLLECTION_NAME);
if (loadResult.getData()) {
    System.out.println("? 集合加載到內存成功!");
} else {
    System.out.println("? 集合加載失敗:" + loadResult.getMessage());
    client.close();
    return;
}

// 7. 執(zhí)行相似度查詢(模擬用戶查詢:"Java 線程相關問題")
String queryText = "Java 線程相關問題";
// 生成查詢向量(同樣用隨機數(shù)模擬,真實場景與數(shù)據(jù)向量用同一模型生成)
List<Float> queryVector = new ArrayList<>();
for (int j = 0; j < VECTOR_DIM; j++) {
    queryVector.add(RandomUtils.nextFloat(0.0f, 1.0f));
}

// 構建查詢參數(shù)
SearchParam searchParam = SearchParam.newBuilder()
        .withCollectionName(COLLECTION_NAME)
        .withMetricType(SearchParam.MetricType.L2) // 距離計算方式(L2為歐氏距離)
        .withTopK(2) // 返回最相似的2條數(shù)據(jù)
        .withVectorFieldName("content_vector")
        .addVector(queryVector)
        .withParams("{\"nprobe\": 10}") // 索引查詢參數(shù)
        .addOutputField("text_content") // 要返回的字段
        .build();

// 執(zhí)行查詢
R<SearchResponse> searchResult = client.search(searchParam);
if (searchResult.getData() != null) {
    System.out.println("\n?? 查詢結果(與\"" + queryText + "\"最相似的2條數(shù)據(jù)):");
    // 解析查詢結果
    SearchResponse.Data data = searchResult.getData().get(0);
    for (int i = 0; i < data.getScoreCount(); i++) {
        float score = data.getScores().get(i); // 相似度分數(shù)(L2距離越小越相似)
        String text = data.getFields().get("text_content").get(i).toString(); // 文本內容
        System.out.println((i+1) + ". 相似度:" + String.format("%.4f", score) + ",內容:" + text);
    }
} else {
    System.out.println("? 查詢失?。? + searchResult.getMessage());
}

// 關閉客戶端
client.close();

這里有兩個關鍵知識點:

  • 索引類型:IVF_FLAT 是 Milvus 最基礎的索引,適合小數(shù)據(jù)量(萬級以內),優(yōu)點是查詢準確、配置簡單;大數(shù)據(jù)量可選用 HNSW 等索引。
  • 相似度分數(shù):我們用 L2 歐氏距離計算,分數(shù)越小說明兩條數(shù)據(jù)的向量越接近,語義越相似。

四、運行驗證:5 分鐘看結果

點擊 IDEA 的運行按鈕,等待程序執(zhí)行完成,控制臺會輸出完整的流程日志,最終會展示與“Java 線程相關問題”最相似的兩條數(shù)據(jù)。

由于我們用隨機數(shù)模擬向量,每次運行的相似度分數(shù)可能不同,但核心流程是通的。如果替換為真實的模型生成向量,就能得到符合語義的查詢結果。

五、進階方向:從“能用”到“好用”

本次演示是最基礎的入門案例,實際開發(fā)中還需要關注這些點:

  • 真實向量生成:引入 Sentence-BERT、ERNIE 等模型,Java 可使用 sentence-transformers 的 Java 封裝版,或通過 HTTP 調用模型服務(如 FastAPI 封裝的模型)。
  • 索引優(yōu)化:根據(jù)數(shù)據(jù)量選擇合適的索引(如百萬級數(shù)據(jù)用 HNSW),調整索引參數(shù)(如 nlist、nprobe)平衡查詢速度和準確率。
  • 數(shù)據(jù)管理:添加數(shù)據(jù)刪除、更新、批量插入等操作,結合業(yè)務場景設計合理的集合結構。
  • 分布式部署:生產環(huán)境用 Milvus 分布式版,而非 Lite 版,確保高可用和高并發(fā)。

六、總結

回顧整個流程,我們用 30 分鐘完成了 Java 連接向量數(shù)據(jù)庫的全流程:從環(huán)境配置、數(shù)據(jù)庫連接,到集合創(chuàng)建、數(shù)據(jù)插入,最終實現(xiàn)了相似度查詢。核心是掌握“向量是橋梁,集合是載體,索引是效率關鍵”這一邏輯。

向量數(shù)據(jù)庫的核心價值在于“理解語義”,它讓數(shù)據(jù)查詢從“精確匹配”升級為“語義聯(lián)想”。作為 Java 開發(fā)者,掌握這項技能能讓你在 AI 應用開發(fā)中更有競爭力——無論是做智能客服、文檔檢索,還是推薦系統(tǒng),向量數(shù)據(jù)庫都是不可或缺的底層工具。

到此這篇關于30分鐘教你上手用Java快速搭建你的第一個向量數(shù)據(jù)庫的文章就介紹到這了,更多相關Java搭建向量數(shù)據(jù)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于Java中代碼塊的執(zhí)行順序

    關于Java中代碼塊的執(zhí)行順序

    這篇文章主要介紹了關于Java中代碼塊的執(zhí)行順序,構造代碼塊是給所有對象進行統(tǒng)一初始化,而構造函數(shù)是給對應的對象初始化,因為構造函數(shù)是可以多個的,運行哪個構造函數(shù)就會建立什么樣的對象,但無論建立哪個對象,都會先執(zhí)行相同的構造代碼塊,需要的朋友可以參考下
    2023-08-08
  • 面向切面的Spring通過切點來選擇連接點實例詳解

    面向切面的Spring通過切點來選擇連接點實例詳解

    這篇文章主要為大家介紹了面向切面的Spring通過切點來選擇連接點實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • java之TreeUtils生成一切對象樹形結構案例

    java之TreeUtils生成一切對象樹形結構案例

    這篇文章主要介紹了java之TreeUtils生成一切對象樹形結構案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring如何通過注解引入外部資源(PropertySource?Value)

    Spring如何通過注解引入外部資源(PropertySource?Value)

    這篇文章主要為大家介紹了Spring通過注解@PropertySource和@Value引入外部資源的方法實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • MyBatis foreach 批量更新實例

    MyBatis foreach 批量更新實例

    這篇文章主要介紹了MyBatis foreach 批量更新實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 深入學習Java單元測試(Junit+Mock+代碼覆蓋率)

    深入學習Java單元測試(Junit+Mock+代碼覆蓋率)

    在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標,甚至,用代碼覆蓋率來考核測試任務完成情況,比如,代碼覆蓋率必須達到80%或 90%。下面我們就來詳細學習下java單元測試吧
    2019-06-06
  • Fluent Mybatis學習之Update語法實踐

    Fluent Mybatis學習之Update語法實踐

    Fluent MyBatis是一個MyBatis的增強工具,沒有對mybatis做任何修改。本篇文章將詳細介紹對Fluent Mybatis中的update語法進行驗證。代碼具有一定價值,感興趣的小伙伴可以學習一下
    2021-11-11
  • Java數(shù)據(jù)結構順序表用法詳解

    Java數(shù)據(jù)結構順序表用法詳解

    順序表是計算機內存中以數(shù)組的形式保存的線性表,線性表的順序存儲是指用一組地址連續(xù)的存儲單元依次存儲線性表中的各個元素、使得線性表中在邏輯結構上相鄰的數(shù)據(jù)元素存儲在相鄰的物理存儲單元中,即通過數(shù)據(jù)元素物理存儲的相鄰關系來反映數(shù)據(jù)元素之間邏輯上的相鄰關系
    2021-10-10
  • SpringBoot有外部依賴如何打運行Jar包的問題

    SpringBoot有外部依賴如何打運行Jar包的問題

    文章描述了如何將外部依賴導入本地Maven倉庫,并在pom文件中進行配置,以及使用maven-assembly-plugin來打包Jar文件的方法,強調了在執(zhí)行命令時需要注意拼寫錯誤,并保持pom文件中的配置與mvn?install命令一致,最后提到成功打包Jar文件,并確認Jar可以正常運行
    2025-10-10
  • Java全面解析XML格式串(JDOM解析)

    Java全面解析XML格式串(JDOM解析)

    下面小編就為大家?guī)硪黄狫ava全面解析XML格式串(JDOM解析)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

绥棱县| 资源县| 龙泉市| 栾川县| 蕲春县| 安溪县| 平遥县| 利津县| 阜平县| 阿鲁科尔沁旗| 微博| 桦川县| 新化县| 灌阳县| 博爱县| 长沙县| 德保县| 崇仁县| 濉溪县| 乾安县| 泽州县| 黄大仙区| 兴国县| 西峡县| 涪陵区| 娄底市| 盖州市| 盈江县| 西峡县| 海原县| 双流县| 杭锦旗| 桑日县| 海林市| 剑河县| 嘉兴市| 易门县| 沭阳县| 临武县| 阿拉善右旗| 公安县|