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

SpringBoot集成Milvus實(shí)現(xiàn)數(shù)據(jù)增刪改查功能

 更新時(shí)間:2025年04月16日 14:21:47   作者:大齡碼農(nóng)有夢(mèng)想  
milvus支持的語言比較多,支持python, Java, Go,node等開發(fā)語言,本文主要介紹如何使用Java語言,采用springboot框架集成和調(diào)用Milvus數(shù)據(jù)庫,這篇文章主要介紹了SpringBoot集成Milvus,實(shí)現(xiàn)數(shù)據(jù)增刪改查,需要的朋友可以參考下

Milvus是一款開源向量數(shù)據(jù)庫,主要用于在大模型領(lǐng)域做向量查詢的相關(guān)操作。milvus支持的語言比較多,支持python, Java, Go,node等開發(fā)語言。本文主要介紹如何使用Java語言,采用springboot框架集成和調(diào)用Milvus數(shù)據(jù)庫。

本文示例使用的milvus版本是 v2.5.4,關(guān)于如何安裝部署milvus向量數(shù)據(jù),請(qǐng)參考上一篇文章:https://lowcode.blog.csdn.net/article/details/145552128

本文使用Java sdk操作Milvus實(shí)現(xiàn)數(shù)據(jù)的增刪改查,需要先對(duì)milvus的基本概念有個(gè)初步的了解,便于對(duì)后面代碼的更好理解。milvus更多幫助請(qǐng)參考官方文檔:https://milvus.io/docs/overview.md

1、Milvus基本概念

  • 數(shù)據(jù)庫Database:與傳統(tǒng)的數(shù)據(jù)庫引擎MySQL類似,你也可以在 Milvus 中創(chuàng)建數(shù)據(jù)庫,并為特定用戶分配權(quán)限來管理它們。然后,此類用戶有權(quán)管理數(shù)據(jù)庫中的集合。一個(gè) Milvus 集群最多支持 64 個(gè)數(shù)據(jù)庫。Milvus 集群附帶一個(gè)名為 'default' 的默認(rèn)數(shù)據(jù)庫。除非另有指定,否則將在 default 數(shù)據(jù)庫中創(chuàng)建集合。
  • 集合Collection :在 Milvus 中,你可以創(chuàng)建多個(gè)集合來管理數(shù)據(jù),并將數(shù)據(jù)作為實(shí)體插入到集合中。Collection 和 entity 類似于關(guān)系數(shù)據(jù)庫中的 table 和 records。集合是具有固定列和變體行的二維表。每列表示一個(gè)字段,每行表示一個(gè)實(shí)體。Collection 是具有固定列和變體行的二維表。每列表示一個(gè)字段,每行表示一個(gè)實(shí)體。需要Schema來實(shí)現(xiàn)此類結(jié)構(gòu)數(shù)據(jù)管理,要插入的每個(gè)實(shí)體都必須滿足Schema中定義的約束。
  • 實(shí)體Entity :在 Milvus 中,Entity 是指 Collection 中共享相同 Schema 的數(shù)據(jù)記錄,一行中每個(gè)字段的數(shù)據(jù)構(gòu)成一個(gè) Entity。因此,同一 Collection 中的 Entities 具有相同的屬性(例如字段名稱、數(shù)據(jù)類型和其他約束)。將 Entity 插入 Collection 時(shí),要插入的 Entity 只有在包含 Schema 中定義的所有字段時(shí)才能成功添加。Milvus 還支持動(dòng)態(tài)字段,以保持 Collection 的可擴(kuò)展性。啟用動(dòng)態(tài)字段后,您可以將 Schema 中未定義的字段插入到 Collection 中。這些字段和值將作為鍵值對(duì)存儲(chǔ)在名為 $meta 的保留字段中。

2、添加maven依賴

創(chuàng)建springboot工程后,在pom.xml文件里引入milvus的sdk

<dependency>
    <groupId>io.milvus</groupId>
    <artifactId>milvus-sdk-java</artifactId>
    <version>2.5.4</version>
</dependency>

本示例使用的是milvus2.5.4最新版本,Java sdk 接口參考文檔:https://milvus.io/api-reference/java/v2.5.x/About.md

注意使用sdk版本跟milvus版本的對(duì)應(yīng)關(guān)系,milvus2.5.x版本建議使用sdk2.5.2以上版本,否則可能會(huì)出現(xiàn)一些詭異問題。

3、配置yml文件

#配置milvus向量數(shù)據(jù)庫的IP和端口,后面構(gòu)建MilvusClient時(shí)需要

server:
  port: 8080
milvus:
  host: 192.168.3.17
  port: 19530

4、創(chuàng)建MilvusClient初始化類

import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MilvusConfig {
    @Value("${milvus.host}")
    private String host;
    @Value("${milvus.port}")
    private Integer port;
    @Bean
    public MilvusClientV2 milvusClientV2() {
        String uri = "http://"+host+":"+port;
        ConnectConfig connectConfig = ConnectConfig.builder()
                .uri(uri)
                .build();
       return new MilvusClientV2(connectConfig);
    }
}

5、創(chuàng)建操作向量庫的Seivce

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.yuncheng.milvus.TestRecord;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.vector.request.GetReq;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.GetResp;
import io.milvus.v2.service.vector.response.InsertResp;
import io.milvus.v2.service.vector.response.SearchResp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Component
public class MilvusDemoService {
    private static final Logger log = LoggerFactory.getLogger(MilvusDemoService.class);
    //類似于mysql中的表,定義一個(gè)名稱為collection_01的集合
    private static final String COLLECTION_NAME = "collection_01";
    //為了測(cè)試驗(yàn)證方便,向量維度定義2
    private static final int VECTOR_DIM = 2;
    private final MilvusClientV2 client;
    public MilvusDemoService(MilvusClientV2 client) {
        this.client = client;
    }
    /**
     * 創(chuàng)建一個(gè)Collection
     */
    public void createCollection() {
        CreateCollectionReq.CollectionSchema schema = client.createSchema();
        schema.addField(AddFieldReq.builder()
                .fieldName("id")
                .dataType(DataType.VarChar)
                .isPrimaryKey(true)
                .autoID(false)
                .build());
        schema.addField(AddFieldReq.builder()
                .fieldName("title")
                .dataType(DataType.VarChar)
                .maxLength(10000)
                .build());
        schema.addField(AddFieldReq.builder()
                .fieldName("title_vector")
                .dataType(DataType.FloatVector)
                .dimension(VECTOR_DIM)
                .build());
        IndexParam indexParam = IndexParam.builder()
                .fieldName("title_vector")
                .metricType(IndexParam.MetricType.COSINE)
                .build();
        CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
                .collectionName(COLLECTION_NAME)
                .collectionSchema(schema)
                .indexParams(Collections.singletonList(indexParam))
                .build();
        client.createCollection(createCollectionReq);
    }
    /**
     * 往collection中插入一條數(shù)據(jù)
     */
    public void insertRecord(TestRecord record) {
        JsonObject vector = new JsonObject();
        vector.addProperty("id", record.getId());
        vector.addProperty("title", record.getTitle());
        List<Float> vectorList = new ArrayList<>();
        //為了模擬測(cè)試,向量寫死2個(gè)
        vectorList.add(2.8f);
        vectorList.add(3.9f);
        Gson gson = new Gson();
        vector.add("title_vector", gson.toJsonTree(vectorList));
        InsertReq insertReq = InsertReq.builder()
                .collectionName(COLLECTION_NAME)
                .data(Collections.singletonList(vector))
                .build();
        InsertResp resp = client.insert(insertReq);
    }
    /**
     * 通過ID獲取記錄
     */
    public GetResp getRecord(String id) {
        GetReq getReq = GetReq.builder()
                .collectionName(COLLECTION_NAME)
                .ids(Collections.singletonList(id))
                .build();
        GetResp resp = client.get(getReq);
        return resp;
    }
    /**
     * 按照向量檢索,找到相似度最近的topK
     */
    public List<List<SearchResp.SearchResult>>  queryVector() {
        SearchResp searchR = client.search(SearchReq.builder()
                .collectionName(COLLECTION_NAME)
                .data(Collections.singletonList(new FloatVec(new float[]{0.9f, 2.1f})))
                .topK(3)
                .outputFields(Collections.singletonList("*"))
                .build());
        List<List<SearchResp.SearchResult>> searchResults = searchR.getSearchResults();
        for (List<SearchResp.SearchResult> results : searchResults) {
            for (SearchResp.SearchResult result : results) {
                log.info("ID="+(String)result.getId() + ",Score="+result.getScore() + ",Result="+result.getEntity().toString());
            }
        }
        return searchResults;
    }
}

這里使用到的一個(gè)簡單的pojo類

public class TestRecord {
    private String id;
    private String title;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

6、創(chuàng)建Controller類

import com.yuncheng.milvus.service.MilvusDemoService;
import io.milvus.v2.service.vector.response.GetResp;
import io.milvus.v2.service.vector.response.SearchResp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("/milvus")
public class MilvusController {
    private static final Logger log = LoggerFactory.getLogger(MilvusController.class);
    @Autowired
    private MilvusDemoService milvusDemoService;
    @GetMapping("/createCollection")
    public void createCollection() {
        milvusDemoService.createCollection();
    }
    @GetMapping("/insertRecord")
    public void insertRecord() throws IOException {
        TestRecord record = new TestRecord();
        record.setId("5");
        record.setTitle("北京是中國的首都,人口有3000多萬人");
        milvusDemoService.insertRecord(record);
    }
    @GetMapping("/getRecord")
    public GetResp getRecord(@RequestParam(name = "id") String id){
        GetResp resp = milvusDemoService.getRecord(id);
        log.info("resp = " +  resp.getResults);
        return resp;
    }
    @GetMapping("/queryVector")
    public List<List<SearchResp.SearchResult>> queryVector() {
        List<List<SearchResp.SearchResult>> searchResults = milvusDemoService.queryVector();
        return searchResults;
    }
}

7、測(cè)試驗(yàn)證CRUD

確保milvus2.5.4向量數(shù)據(jù)庫正常運(yùn)行,然后啟動(dòng)springboot工程,進(jìn)行對(duì)milvus向量數(shù)據(jù)庫測(cè)試驗(yàn)證。

7.1、創(chuàng)建Collection

http://localhost:8080/milvus/createCollection

執(zhí)行后,登錄milvus控制臺(tái)webUI查看

點(diǎn)擊collection名稱,查看詳細(xì)的結(jié)構(gòu)定義,類似于mysql中的表結(jié)構(gòu)定義:

其中,id、title、title_vector字段是程序里定義的字段,另外RowID和Timestamp字段是collection默認(rèn)自帶的字段。

7.2、插入數(shù)據(jù)

http://localhost:8080/milvus/insertRecord

為了測(cè)試方便,本示例寫死了測(cè)試數(shù)據(jù),往milvus中插入了5條數(shù)據(jù)

7.3、查詢單條記錄

http://localhost:8080/milvus/getRecord?id=2

返回JSON結(jié)果集

{
  "getResults": [
    {
      "entity": {
        "title_vector": [1, 2],
        "id": "2",
        "title": "張三是英國人,他喜歡吃中國火鍋"
      }
    }
  ]
}

7.4、按向量檢索相似度

http://localhost:8080/milvus/queryVector

返回結(jié)果集:

[
  [
    {
      "entity": {
        "title_vector": [0.8, 1.9],
        "id": "4",
        "title": "王五是老師,她教學(xué)AI算法"
      },
      "score": 0.9999797,
      "id": "4"
    },
    {
      "entity": {
        "title_vector": [1, 2],
        "id": "2",
        "title": "張三是英國人,他喜歡吃中國火鍋"
      },
      "score": 0.99827427,
      "id": "2"
    },
    {
      "entity": {
        "title_vector": [1, 2],
        "id": "1",
        "title": "我是中國人,我喜歡吃火鍋"
      },
      "score": 0.99827427,
      "id": "1"
    }
  ]
]

其中,score為向量相似度分值,如果score=1,則表示完全一樣,score小于1,表示接近。這里為了測(cè)試方面,插入數(shù)據(jù)時(shí),在向量字段里寫死了幾個(gè)固定的List<Float>值,真實(shí)的業(yè)務(wù)場(chǎng)景中,要通過Embedding模型計(jì)算生成,后續(xù)文章中介紹如何調(diào)用AI中的Embedding服務(wù),生成向量化的float值。

到此這篇關(guān)于SpringBoot集成Milvus,實(shí)現(xiàn)數(shù)據(jù)增刪改查的文章就介紹到這了,更多相關(guān)SpringBoot集成Milvus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring@Value使用獲取配置信息為null的操作

    Spring@Value使用獲取配置信息為null的操作

    這篇文章主要介紹了Spring@Value使用獲取配置信息為null的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法

    java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法

    這篇文章主要介紹了java不解壓直接讀取壓縮包中文件的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringSecurity+Redis認(rèn)證過程小結(jié)

    SpringSecurity+Redis認(rèn)證過程小結(jié)

    這篇文章主要介紹了SpringSecurity+Redis認(rèn)證過程小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Java全能工具類之Hutool的用法詳解

    Java全能工具類之Hutool的用法詳解

    Hutool是一個(gè)Java工具類庫,由國內(nèi)的程序員loolly開發(fā),目的是提供一些方便、快捷、實(shí)用的工具類和工具方法,本文就來詳細(xì)聊聊它的使用吧
    2023-03-03
  • 詳解java.lang.reflect.Modifier.isInterface()方法

    詳解java.lang.reflect.Modifier.isInterface()方法

    這篇文章主要介紹了詳解java.lang.reflect.Modifier.isInterface()方法的相關(guān)資料,這里提供實(shí)例幫助大家理解這個(gè)方法的使用,需要的朋友可以參考下
    2017-09-09
  • 一文詳解Java Stream的sorted自定義排序

    一文詳解Java Stream的sorted自定義排序

    Java stream中的sorted方法是用于對(duì)流中的元素進(jìn)行排序的方法,它可以接受一個(gè)comparator參數(shù),用于指定排序規(guī)則,sorted方法返回一個(gè)新的流,其中的元素按照指定的排序規(guī)則進(jìn)行排序,本文給大家詳細(xì)介紹了Java Stream的sorted自定義排序,需要的朋友可以參考下
    2025-06-06
  • 在Docker中部署Spring Boot項(xiàng)目過程詳解

    在Docker中部署Spring Boot項(xiàng)目過程詳解

    這篇文章主要介紹了在Docker中部署Spring Boot項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Mybatis 創(chuàng)建方法、全局配置教程詳解

    Mybatis 創(chuàng)建方法、全局配置教程詳解

    MyBatis是一個(gè)半自動(dòng)化的輕量級(jí)的持久化層框架。 MyBatis實(shí)際上是Ibatis3.0版本以后的持久化層框架,下面通過本文給大家分享Mybatis 創(chuàng)建方法、全局配置教程詳解,需要的朋友參考下吧
    2017-09-09
  • Java持久層框架MyBatis簡單實(shí)例

    Java持久層框架MyBatis簡單實(shí)例

    MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。本文重點(diǎn)給大家介紹Java持久層框架MyBatis簡單實(shí)例,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-07-07
  • 使用Java打印PDF文件的自定義設(shè)置指南

    使用Java打印PDF文件的自定義設(shè)置指南

    在 Java 中處理 PDF 文件時(shí),除了能夠讀取、修改和生成 PDF 文件外,打印 PDF 文件同樣是一個(gè)常見需求,本文將介紹如何使用 Java 打印 PDF 文件,重點(diǎn)講解如何自定義打印機(jī)、頁面范圍、雙面打印、紙張大小等常見設(shè)置,需要的朋友可以參考下
    2026-02-02

最新評(píng)論

罗定市| 牟定县| 沾益县| 盐山县| 汽车| 屯门区| 灵宝市| 翁牛特旗| 磐石市| 康保县| 砀山县| 新邵县| 大理市| 增城市| 任丘市| 溆浦县| 柘城县| 商洛市| 毕节市| 英超| 中卫市| 郎溪县| 南郑县| 日喀则市| 阳曲县| 日喀则市| 大冶市| 浦东新区| 侯马市| 东光县| 东阿县| 永宁县| 疏勒县| 留坝县| 靖江市| 宣化县| 尚志市| 始兴县| 蕲春县| 微博| 济源市|