From d67cd05ae23013b00751fe0701da5f1d53422ba1 Mon Sep 17 00:00:00 2001
From: ageerle <ageerle@163.com>
Date: 星期五, 14 三月 2025 11:18:41 +0800
Subject: [PATCH] fix: 修复milvus无法使用

---
 ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java |  201 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 175 insertions(+), 26 deletions(-)

diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java
index c083ef4..eb993f9 100644
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java
+++ b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java
@@ -2,19 +2,16 @@
 
 import io.milvus.client.MilvusServiceClient;
 import io.milvus.grpc.DataType;
+import io.milvus.grpc.DescribeIndexResponse;
+import io.milvus.grpc.MutationResult;
 import io.milvus.grpc.SearchResults;
-import io.milvus.param.ConnectParam;
-import io.milvus.param.IndexType;
-import io.milvus.param.MetricType;
-import io.milvus.param.R;
-import io.milvus.param.collection.CreateCollectionParam;
-import io.milvus.param.collection.DropCollectionParam;
-import io.milvus.param.collection.FieldType;
-import io.milvus.param.collection.LoadCollectionParam;
+import io.milvus.param.*;
+import io.milvus.param.collection.*;
 import io.milvus.param.dml.DeleteParam;
 import io.milvus.param.dml.InsertParam;
 import io.milvus.param.dml.SearchParam;
 import io.milvus.param.index.CreateIndexParam;
+import io.milvus.param.index.DescribeIndexParam;
 import io.milvus.param.partition.CreatePartitionParam;
 import io.milvus.response.QueryResultsWrapper;
 import io.milvus.response.SearchResultsWrapper;
@@ -32,7 +29,7 @@
 
 @Service
 @Slf4j
-public class MilvusVectorStore implements VectorStore{
+public class MilvusVectorStore implements VectorStore {
 
     private volatile Integer dimension;
     private volatile String collectionName;
@@ -48,7 +45,7 @@
     }
 
     @PostConstruct
-    public void init(){
+    public void init() {
         String milvusHost = configService.getConfigValue("milvus", "host");
         String milvausPort = configService.getConfigValue("milvus", "port");
         milvusServiceClient = new MilvusServiceClient(
@@ -137,11 +134,103 @@
 
     @Override
     public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
+        String fullCollectionName = collectionName + kid;
 
-        if (StringUtils.isNotBlank(docId)){
+        // 妫�鏌ラ泦鍚堟槸鍚﹀瓨鍦�
+        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .build();
+        R<Boolean> booleanR = milvusServiceClient.hasCollection(hasCollectionParam);
+
+        if (booleanR.getStatus() == R.Status.Success.getCode()) {
+            boolean collectionExists = booleanR.getData().booleanValue();
+            if (!collectionExists) {
+                // 闆嗗悎涓嶅瓨鍦紝鍒涘缓闆嗗悎
+                List<FieldType> fieldTypes = new ArrayList<>();
+                // 鍋囪杩欓噷瀹氫箟 id 瀛楁锛屾牴鎹疄闄呮儏鍐典慨鏀�
+                FieldType idField = FieldType.newBuilder()
+                        .withName("id")
+                        .withDataType(DataType.Int64)
+                        .withPrimaryKey(true)
+                        .withAutoID(true)
+                        .build();
+                fieldTypes.add(idField);
+
+                // 瀹氫箟鍚戦噺瀛楁
+                FieldType vectorField = FieldType.newBuilder()
+                        .withName("fv")
+                        .withDataType(DataType.FloatVector)
+                        .withDimension(vectorList.get(0).size())
+                        .build();
+                fieldTypes.add(vectorField);
+
+                // 瀹氫箟鍏朵粬瀛楁
+                FieldType contentField = FieldType.newBuilder()
+                        .withName("content")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(chunkList.size() * 1024) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(contentField);
+
+                FieldType kidField = FieldType.newBuilder()
+                        .withName("kid")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(kidField);
+
+                FieldType docIdField = FieldType.newBuilder()
+                        .withName("docId")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(docIdField);
+
+                FieldType fidField = FieldType.newBuilder()
+                        .withName("fid")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(fidField);
+
+                CreateCollectionParam createCollectionParam = CreateCollectionParam.newBuilder()
+                        .withCollectionName(fullCollectionName)
+                        .withFieldTypes(fieldTypes)
+                        .build();
+
+                R<RpcStatus> collection = milvusServiceClient.createCollection(createCollectionParam);
+                if (collection.getStatus() == R.Status.Success.getCode()) {
+                    System.out.println("闆嗗悎 " + fullCollectionName + " 鍒涘缓鎴愬姛");
+
+                    // 鍒涘缓绱㈠紩
+                    CreateIndexParam createIndexParam = CreateIndexParam.newBuilder()
+                            .withCollectionName(fullCollectionName)
+                            .withFieldName("fv") // 鍚戦噺瀛楁鍚�
+                            .withIndexType(IndexType.IVF_FLAT) // 绱㈠紩绫诲瀷
+                            .withMetricType(MetricType.IP)
+                            .withExtraParam("{\"nlist\":1024}") // 绱㈠紩鍙傛暟
+                            .build();
+                    R<RpcStatus> indexResponse = milvusServiceClient.createIndex(createIndexParam);
+                    if (indexResponse.getStatus() == R.Status.Success.getCode()) {
+                        System.out.println("绱㈠紩鍒涘缓鎴愬姛");
+                    } else {
+                        System.err.println("绱㈠紩鍒涘缓澶辫触: " + indexResponse.getMessage());
+                        return;
+                    }
+                } else {
+                    System.err.println("闆嗗悎鍒涘缓澶辫触: " + collection.getMessage());
+                    return;
+                }
+            }
+        } else {
+            System.err.println("妫�鏌ラ泦鍚堟槸鍚﹀瓨鍦ㄦ椂鍑洪敊: " + booleanR.getMessage());
+            return;
+        }
+
+        if (StringUtils.isNotBlank(docId)) {
             milvusServiceClient.createPartition(
                     CreatePartitionParam.newBuilder()
-                            .withCollectionName(collectionName + kid)
+                            .withCollectionName(fullCollectionName)
                             .withPartitionName(docId)
                             .build()
             );
@@ -169,15 +258,29 @@
         fields.add(new InsertParam.Field("fv", vectorFloatList));
 
         InsertParam insertParam = InsertParam.newBuilder()
-                .withCollectionName(collectionName + kid)
+                .withCollectionName(fullCollectionName)
                 .withPartitionName(docId)
                 .withFields(fields)
                 .build();
-        milvusServiceClient.insert(insertParam);
-        // milvus鍦ㄥ皢鏁版嵁瑁呰浇鍒板唴瀛樺悗鎵嶈兘杩涜鍚戦噺璁$畻
-        milvusServiceClient.loadCollection(LoadCollectionParam.newBuilder().withCollectionName(collectionName + kid).build());
-    }
+        System.out.println("=========================");
 
+        R<MutationResult> insert = milvusServiceClient.insert(insertParam);
+        if (insert.getStatus() == R.Status.Success.getCode()) {
+            System.out.println("鎻掑叆鎴愬姛锛屾彃鍏ョ殑琛屾暟: " + insert.getData().getInsertCnt());
+        } else {
+            System.err.println("鎻掑叆澶辫触: " + insert.getMessage());
+        }
+        System.out.println("=========================");
+        // milvus鍦ㄥ皢鏁版嵁瑁呰浇鍒板唴瀛樺悗鎵嶈兘杩涜鍚戦噺璁$畻.
+        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .build();
+        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
+        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
+            System.err.println("鍔犺浇闆嗗悎 " + fullCollectionName + " 鍒板唴瀛樻椂鍑洪敊锛�" + loadResponse.getMessage());
+        }
+//        milvusServiceClient.loadCollection(LoadCollectionParam.newBuilder().withCollectionName(fullCollectionName).build());
+    }
 
 
     @Override
@@ -202,7 +305,39 @@
 
     @Override
     public List<String> nearest(List<Double> queryVector, String kid) {
-        List<String> search_output_fields = Arrays.asList("content","fv");
+        String fullCollectionName = collectionName + kid;
+
+        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .build();
+
+        R<Boolean> booleanR = milvusServiceClient.hasCollection(hasCollectionParam);
+        if (booleanR.getStatus() != R.Status.Success.getCode() || !booleanR.getData().booleanValue()) {
+            System.err.println("闆嗗悎 " + fullCollectionName + " 涓嶅瓨鍦ㄦ垨妫�鏌ラ泦鍚堝瓨鍦ㄦ�ф椂鍑洪敊銆�");
+            return new ArrayList<>();
+        }
+
+        DescribeIndexParam describeIndexParam = DescribeIndexParam.newBuilder().withCollectionName(fullCollectionName).build();
+
+        R<DescribeIndexResponse> describeIndexResponseR = milvusServiceClient.describeIndex(describeIndexParam);
+
+        if (describeIndexResponseR.getStatus() == R.Status.Success.getCode()) {
+            System.out.println("绱㈠紩淇℃伅: " + describeIndexResponseR.getData().getIndexDescriptionsCount());
+        } else {
+            System.err.println("鑾峰彇绱㈠紩澶辫触: " + describeIndexResponseR.getMessage());
+        }
+
+//        // 鍔犺浇闆嗗悎鍒板唴瀛�
+//        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
+//                .withCollectionName(fullCollectionName)
+//                .build();
+//        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
+//        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
+//            System.err.println("鍔犺浇闆嗗悎 " + fullCollectionName + " 鍒板唴瀛樻椂鍑洪敊锛�" + loadResponse.getMessage());
+//            return new ArrayList<>();
+//        }
+
+        List<String> search_output_fields = Arrays.asList("content", "fv");
         List<Float> fv = new ArrayList<>();
         for (int i = 0; i < queryVector.size(); i++) {
             fv.add(queryVector.get(i).floatValue());
@@ -219,22 +354,36 @@
                 .withVectorFieldName("fv")
                 .withParams(search_param)
                 .build();
+        System.out.println("SearchParam: " + searchParam.toString());
         R<SearchResults> respSearch = milvusServiceClient.search(searchParam);
-        SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(respSearch.getData().getResults());
-        List<QueryResultsWrapper.RowRecord> rowRecords = wrapperSearch.getRowRecords();
+        if (respSearch.getStatus() == R.Status.Success.getCode()) {
+            SearchResults searchResults = respSearch.getData();
+            if (searchResults != null) {
+                System.out.println(searchResults.getResults());
+                SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(searchResults.getResults());
+                List<QueryResultsWrapper.RowRecord> rowRecords = wrapperSearch.getRowRecords();
 
-        List<String> resultList = new ArrayList<>();
-        if (resultList!=null && resultList.size() > 0){
-            for (int i = 0; i < rowRecords.size(); i++) {
-                String content = rowRecords.get(i).get("content").toString();
-                resultList.add(content);
+                List<String> resultList = new ArrayList<>();
+                if (rowRecords != null && !rowRecords.isEmpty()) {
+                    for (QueryResultsWrapper.RowRecord rowRecord : rowRecords) {
+                        String content = rowRecord.get("content").toString();
+                        resultList.add(content);
+                    }
+                }
+                return resultList;
+            } else {
+                System.err.println("鎼滅储缁撴灉涓虹┖");
             }
+        } else {
+            System.err.println("鎼滅储鎿嶄綔澶辫触: " + respSearch.getMessage());
         }
-        return resultList;
+        return new ArrayList<>();
+
     }
 
     /**
      * milvus 涓嶆敮鎸侀�氳繃鏂囨湰妫�绱㈢浉浼兼��
+     *
      * @param query
      * @param kid
      * @return

--
Gitblit v1.9.3