Kaynağa Gözat

增加了http://127.0.0.1:18203/v1/md/collections/test1/_search

dwp 1 ay önce
ebeveyn
işleme
1a6584da5a
85 değiştirilmiş dosya ile 895 ekleme ve 469 silme
  1. 20 0
      gtbook/src/main/java/org/cnnlp/data/md/MdSearcher.java
  2. 1 1
      server/pom.xml
  3. 1 1
      server/src/main/java/com/giantan/baiying/service/impl/ConvertService.java
  4. 1 1
      server/src/main/java/com/giantan/baiying/tasks/ToEmbeddingTask.java
  5. 68 0
      server/src/main/java/com/giantan/data/common/model/CollSearchRequest.java
  6. 1 1
      server/src/main/java/com/giantan/data/common/model/GBaseKeyValue.java
  7. 1 2
      server/src/main/java/com/giantan/data/dk/controller/DkDocsController.java
  8. 1 2
      server/src/main/java/com/giantan/data/dk/dto/GTool.java
  9. 1 1
      server/src/main/java/com/giantan/data/dk/repository/DkRepository.java
  10. 1 1
      server/src/main/java/com/giantan/data/dk/service/DkCollectionService.java
  11. 1 2
      server/src/main/java/com/giantan/data/dk/service/DkDocsService.java
  12. 1 1
      server/src/main/java/com/giantan/data/dk/service/IDkDocsService.java
  13. 1 1
      server/src/main/java/com/giantan/data/kvs/controller/KvDocsController.java
  14. 2 0
      server/src/main/java/com/giantan/data/kvs/kvstore/IGDynamicRepository.java
  15. 2 0
      server/src/main/java/com/giantan/data/kvs/kvstore/IGkvRepository.java
  16. 1 1
      server/src/main/java/com/giantan/data/kvs/repository/GConverter.java
  17. 1 1
      server/src/main/java/com/giantan/data/kvs/repository/GDynamicRepository.java
  18. 1 1
      server/src/main/java/com/giantan/data/kvs/repository/GRepository.java
  19. 1 1
      server/src/main/java/com/giantan/data/kvs/repository/index/GIndexedRepository.java
  20. 1 1
      server/src/main/java/com/giantan/data/kvs/service/ICollection.java
  21. 1 1
      server/src/main/java/com/giantan/data/kvs/service/ICollectionAdmin.java
  22. 1 1
      server/src/main/java/com/giantan/data/kvs/service/ICollectionService.java
  23. 1 1
      server/src/main/java/com/giantan/data/kvs/service/impl/GCollection.java
  24. 1 1
      server/src/main/java/com/giantan/data/kvs/service/impl/KvCollectionService.java
  25. 1 1
      server/src/main/java/com/giantan/data/mds/MdsApplication.java
  26. 2 2
      server/src/main/java/com/giantan/data/mds/controller/ChunkController.java
  27. 70 0
      server/src/main/java/com/giantan/data/mds/controller/CollectionController.java
  28. 16 10
      server/src/main/java/com/giantan/data/mds/controller/CollsSearchController.java
  29. 55 55
      server/src/main/java/com/giantan/data/mds/controller/DocController.java
  30. 3 3
      server/src/main/java/com/giantan/data/mds/controller/DownloadController.java
  31. 0 71
      server/src/main/java/com/giantan/data/mds/controller/MdCollectionsController.java
  32. 1 1
      server/src/main/java/com/giantan/data/mds/controller/ProxySearchContoller.java
  33. 5 4
      server/src/main/java/com/giantan/data/mds/controller/StatusController.java
  34. 26 25
      server/src/main/java/com/giantan/data/mds/controller/TaskController.java
  35. 27 27
      server/src/main/java/com/giantan/data/mds/controller/TaxonomyController.java
  36. 0 3
      server/src/main/java/com/giantan/data/mds/repository/MdDynamicChunkRepository.java
  37. 5 0
      server/src/main/java/com/giantan/data/mds/repository/MdIndexer.java
  38. 1 1
      server/src/main/java/com/giantan/data/mds/service/IDynamicDocService.java
  39. 0 2
      server/src/main/java/com/giantan/data/mds/service/IMdChunksService.java
  40. 3 2
      server/src/main/java/com/giantan/data/mds/service/IMdDocsService.java
  41. 1 2
      server/src/main/java/com/giantan/data/mds/service/IMdFilesService.java
  42. 1 1
      server/src/main/java/com/giantan/data/mds/service/impl/MdCollectionsService.java
  43. 47 10
      server/src/main/java/com/giantan/data/mds/service/impl/MdCollsSearchService.java
  44. 110 17
      server/src/main/java/com/giantan/data/mds/service/impl/MdDocsService.java
  45. 1 1
      server/src/main/java/com/giantan/data/mds/service/impl/MdFilesService.java
  46. 1 2
      server/src/main/java/com/giantan/data/mds/service/impl/MdTaxonomyService.java
  47. 2 2
      server/src/main/java/com/giantan/data/mds/task/MdPersistentTaskService.java
  48. 1 0
      server/src/main/java/com/giantan/data/mds/task/impl/BaseTaskHandler.java
  49. 1 1
      server/src/main/java/com/giantan/data/mds/task/impl/ChunksTaskHandler.java
  50. 2 2
      server/src/main/java/com/giantan/data/mds/task/impl/MdsTaskHandler.java
  51. 166 0
      server/src/main/java/com/giantan/data/mds/util/NlpTools.java
  52. 25 0
      server/src/main/java/com/giantan/data/mds/util/Sentence.java
  53. 1 1
      server/src/main/java/com/giantan/data/qa/backup/v2/V2CollsSearchController.java
  54. 1 1
      server/src/main/java/com/giantan/data/qa/backup/v2/V2DocsController.java
  55. 2 2
      server/src/main/java/com/giantan/data/qa/backup/v2/V2TaskController.java
  56. 1 1
      server/src/main/java/com/giantan/data/qa/backup/v2/V2TaxonomyController.java
  57. 79 0
      server/src/main/java/com/giantan/data/qa/controller/CollectionController.java
  58. 5 5
      server/src/main/java/com/giantan/data/qa/controller/CollsSearchController.java
  59. 2 2
      server/src/main/java/com/giantan/data/qa/controller/ProxySearchContoller.java
  60. 0 79
      server/src/main/java/com/giantan/data/qa/controller/QaCollectionsController.java
  61. 46 47
      server/src/main/java/com/giantan/data/qa/controller/QaController.java
  62. 9 9
      server/src/main/java/com/giantan/data/qa/controller/TaskController.java
  63. 20 28
      server/src/main/java/com/giantan/data/qa/controller/TaxonomyController.java
  64. 1 1
      server/src/main/java/com/giantan/data/qa/service/IQaDocsService.java
  65. 1 1
      server/src/main/java/com/giantan/data/qa/service/QaCollectionService.java
  66. 1 1
      server/src/main/java/com/giantan/data/qa/service/QaCollsSearchService.java
  67. 1 1
      server/src/main/java/com/giantan/data/qa/service/QaDocsService.java
  68. 1 1
      server/src/main/java/com/giantan/data/qa/service/QaTaxonomyService.java
  69. 2 2
      server/src/main/java/com/giantan/data/qa/service/task/QaPersistentTaskService.java
  70. 1 0
      server/src/main/java/com/giantan/data/qa/service/task/QasTaskHandler.java
  71. 2 1
      server/src/main/java/com/giantan/data/tasks/IPersistentTaskService.java
  72. 2 0
      server/src/main/java/com/giantan/data/tasks/ITaskHandler.java
  73. 2 1
      server/src/main/java/com/giantan/data/tasks/ITaskManager.java
  74. 1 0
      server/src/main/java/com/giantan/data/tasks/TaskEventListener.java
  75. 2 1
      server/src/main/java/com/giantan/data/tasks/TaskManager.java
  76. 0 8
      server/src/main/java/com/giantan/data/tasks/controller/TaskController.java
  77. 5 1
      server/src/main/java/com/giantan/data/tasks/model/TaskContext.java
  78. 1 2
      server/src/main/java/com/giantan/data/tasks/model/TaskStatusHistory.java
  79. 1 0
      server/src/main/java/com/giantan/data/tasks/repository/DynamicTaskRepository.java
  80. 2 1
      server/src/main/java/com/giantan/data/tasks/repository/PersistentTaskManager.java
  81. 2 0
      server/src/main/java/com/giantan/data/tasks/repository/TaskConverter.java
  82. 2 1
      server/src/main/resources/application.yml
  83. 1 1
      server/src/test/java/com/giantan/data/mds/GRepositoryTest.java
  84. 1 2
      server/src/test/java/com/giantan/data/mds/MdsApplicationTests.java
  85. 12 0
      server/src/test/java/com/giantan/data/mds/util/NlpToolsTest.java

+ 20 - 0
gtbook/src/main/java/org/cnnlp/data/md/MdSearcher.java

@@ -18,6 +18,7 @@ public class MdSearcher {
     public final static String KEY_MATCH = "match";
     public final static String KEY_HEADING = "headings";
     TextCollectingVisitor textr;
+    String title;
 
     DocTree dt;
 
@@ -34,6 +35,14 @@ public class MdSearcher {
         this.dt = dt;
     }
 
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
     public String getText() {
         return dt.getText();
     }
@@ -347,6 +356,17 @@ public class MdSearcher {
         return ls;
     }
 
+    public List<String> getHeadingsByStartOffset(int startOffset) {
+        if (startOffset < 0 || dt == null) {
+            return null;
+        }
+        int[] nodeRange = getNodeRange(new int[]{startOffset, startOffset + 1});
+        if (nodeRange == null) {
+            return null;
+        }
+        return getHeadings(nodeRange[0]);
+    }
+
     public void outTitles() {
         int[] depthes = dt.getDepthes();
         List<Node> nodes = dt.getSource();

+ 1 - 1
server/pom.xml

@@ -9,7 +9,7 @@
         <version>1.0.0</version>
     </parent>
 
-    <version>3.1.3</version>
+    <version>3.1.8</version>
     <artifactId>mdserver</artifactId>
 
     <properties>

+ 1 - 1
server/src/main/java/com/giantan/baiying/service/impl/ConvertService.java

@@ -1,7 +1,7 @@
 package com.giantan.baiying.service.impl;
 
 //import com.giantan.gkvs.model.GBaseKeyValue;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.baiying.model.S3DocDto;
 import com.giantan.baiying.tasks.*;
 import com.giantan.baiying.tasks.impl.*;

+ 1 - 1
server/src/main/java/com/giantan/baiying/tasks/ToEmbeddingTask.java

@@ -1,6 +1,6 @@
 package com.giantan.baiying.tasks;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.baiying.service.ILLMService;
 import com.giantan.gfs.service.IGkbService;
 import com.giantan.gfs.service.impl.S3Constants;

+ 68 - 0
server/src/main/java/com/giantan/data/common/model/CollSearchRequest.java

@@ -0,0 +1,68 @@
+package com.giantan.data.common.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CollSearchRequest {
+    String query;
+    Integer topK = 3;
+    SearchType searchType = SearchType.HYBRID;
+    List<String> tags;
+    String tagsMatch = "any"; // = "any" | "all";
+    String path;
+    String fromTime;
+    String toTime;
+
+    Double similarityThreshold;
+    String filterExpression;
+
+    Integer maxContentLength ;
+
+    public Map<String,Object> toMap() {
+        Map<String,Object> map = new HashMap<String,Object>();
+        map.put("query", query);
+        //map.put("collections", collections);
+        map.put("topK", topK);
+
+        map.put("searchType", searchType);
+
+        if (tags != null && !tags.isEmpty()) {
+            map.put("tags", tags);
+            if (tagsMatch != null && !tagsMatch.isEmpty()) {
+                if (tagsMatch.equals("all")) {
+                    map.put("tagsAll", true);
+                }else{
+                    map.put("tagsAll", false);
+                }
+            }else{
+                map.put("tagsAll", false);
+            }
+        }
+        if (path != null && !path.isEmpty()) {
+            map.put("path", path);
+        }
+        if (fromTime != null && !fromTime.isEmpty()) {
+            map.put("fromTime", fromTime);
+        }
+        if (toTime != null && !toTime.isEmpty()) {
+            map.put("toTime", toTime);
+        }
+        if (similarityThreshold != null) {
+            map.put("similarityThreshold", similarityThreshold);
+        }
+        if (filterExpression != null && !filterExpression.isEmpty()) {
+            map.put("filterExpression", filterExpression);
+        }
+        if (maxContentLength != null) {
+            map.put("maxContentLength", maxContentLength);
+        }
+        return map;
+    }
+
+}

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/kvstore/GBaseKeyValue.java → server/src/main/java/com/giantan/data/common/model/GBaseKeyValue.java

@@ -1,4 +1,4 @@
-package com.giantan.data.kvs.kvstore;
+package com.giantan.data.common.model;
 
 import java.io.Serializable;
 import java.util.LinkedHashMap;

+ 1 - 2
server/src/main/java/com/giantan/data/dk/controller/DkDocsController.java

@@ -4,11 +4,10 @@ import com.giantan.ai.common.reponse.R;
 import com.giantan.data.dk.constant.DkConstants;
 import com.giantan.data.dk.dto.GTool;
 import com.giantan.data.dk.service.DkDocsService;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Map;

+ 1 - 2
server/src/main/java/com/giantan/data/dk/dto/GTool.java

@@ -1,9 +1,8 @@
 package com.giantan.data.dk.dto;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import lombok.Data;
 
-import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
 import java.util.List;
 import java.util.Map;

+ 1 - 1
server/src/main/java/com/giantan/data/dk/repository/DkRepository.java

@@ -6,7 +6,7 @@ import com.giantan.ai.util.id.IdGenerator;
 import com.giantan.ai.util.id.UlidGenerator;
 import com.giantan.data.dk.constant.DkConfig;
 import com.giantan.data.dk.dto.GTool;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.util.JdbcUtils;

+ 1 - 1
server/src/main/java/com/giantan/data/dk/service/DkCollectionService.java

@@ -1,7 +1,7 @@
 package com.giantan.data.dk.service;
 
 import com.giantan.data.dk.repository.*;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.kvs.repository.GRepository;
 import com.giantan.data.mds.service.CollectionInstance;

+ 1 - 2
server/src/main/java/com/giantan/data/dk/service/DkDocsService.java

@@ -5,12 +5,11 @@ import com.giantan.data.dk.repository.DkIndexer;
 import com.giantan.data.dk.repository.DkRepository;
 import com.giantan.data.index.IHybridSearch;
 import com.giantan.data.index.dto.DocSearchResp;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
-import java.io.IOException;
 import java.util.*;
 
 @Service

+ 1 - 1
server/src/main/java/com/giantan/data/dk/service/IDkDocsService.java

@@ -1,6 +1,6 @@
 package com.giantan.data.dk.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import java.io.IOException;
 import java.util.List;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/controller/KvDocsController.java

@@ -3,7 +3,7 @@ package com.giantan.data.kvs.controller;
 import com.giantan.ai.common.reponse.R;
 import com.giantan.data.kvs.constant.KvConstants;
 import com.giantan.data.kvs.repository.GDynamicRepository;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;

+ 2 - 0
server/src/main/java/com/giantan/data/kvs/kvstore/IGDynamicRepository.java

@@ -1,5 +1,7 @@
 package com.giantan.data.kvs.kvstore;
 
+import com.giantan.data.common.model.GBaseKeyValue;
+
 import java.sql.SQLException;
 import java.util.List;
 import java.util.Map;

+ 2 - 0
server/src/main/java/com/giantan/data/kvs/kvstore/IGkvRepository.java

@@ -1,6 +1,8 @@
 package com.giantan.data.kvs.kvstore;
 
 
+import com.giantan.data.common.model.GBaseKeyValue;
+
 import java.sql.SQLException;
 import java.util.List;
 import java.util.Map;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/repository/GConverter.java

@@ -1,6 +1,6 @@
 package com.giantan.data.kvs.repository;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.ai.util.id.IdGenerator;
 
 import java.util.ArrayList;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/repository/GDynamicRepository.java

@@ -5,7 +5,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.giantan.ai.util.JsonUtils;
 import com.giantan.ai.util.PathUtils;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.kvstore.IGDynamicRepository;
 import com.giantan.ai.util.id.IdGenerator;
 import com.giantan.ai.util.id.UuidGenerator;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/repository/GRepository.java

@@ -33,7 +33,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.giantan.ai.util.JsonUtils;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.kvstore.IGkvRepository;
 import com.giantan.ai.util.id.IdGenerator;
 import com.giantan.ai.util.id.UuidGenerator;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/repository/index/GIndexedRepository.java

@@ -8,7 +8,7 @@ import com.giantan.ai.util.JsonUtils;
 import com.giantan.ai.util.PathUtils;
 import com.giantan.ai.util.id.IdGenerator;
 import com.giantan.ai.util.id.UlidGenerator;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.kvstore.IGDynamicRepository;
 import com.giantan.data.kvs.repository.*;
 import com.giantan.data.util.JdbcUtils;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/service/ICollection.java

@@ -1,6 +1,6 @@
 package com.giantan.data.kvs.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.kvstore.IGkvRepository;
 
 import java.util.Map;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/service/ICollectionAdmin.java

@@ -1,6 +1,6 @@
 package com.giantan.data.kvs.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import java.sql.SQLException;
 import java.util.List;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/service/ICollectionService.java

@@ -1,7 +1,7 @@
 package com.giantan.data.kvs.service;
 
 import com.giantan.ai.util.dict.GItem;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import java.util.List;
 import java.util.Map;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/service/impl/GCollection.java

@@ -3,7 +3,7 @@ package com.giantan.data.kvs.service.impl;
 import com.giantan.ai.util.dict.GItem;
 import com.giantan.data.kvs.constant.KvConstants;
 import com.giantan.data.kvs.service.ICollection;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GConverter;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.kvs.repository.GRepository;

+ 1 - 1
server/src/main/java/com/giantan/data/kvs/service/impl/KvCollectionService.java

@@ -5,7 +5,7 @@ import com.giantan.ai.util.dict.GItem;
 import com.giantan.data.kvs.constant.KvConfig;
 import com.giantan.data.kvs.service.ICollection;
 import com.giantan.data.kvs.service.ICollectionService;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.kvs.repository.GRepository;
 import jakarta.annotation.PostConstruct;

+ 1 - 1
server/src/main/java/com/giantan/data/mds/MdsApplication.java

@@ -16,7 +16,7 @@ public class MdsApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(MdsApplication.class, args);
-        log.info("Mds server started. Version 3.1.3");
+        log.info("Mds server started. Version 3.1.8");
     }
 
 }

+ 2 - 2
server/src/main/java/com/giantan/data/mds/controller/ChunkController.java

@@ -50,8 +50,8 @@ public class ChunkController {
     }
 
     @DeleteMapping("/{id}")
-    public R deleteByIds(@PathVariable String coll, @PathVariable List<String> ids) throws IOException, InterruptedException {
-        long ret = mdChunksService.deleteByIds(coll, ids);;
+    public R deleteByIds(@PathVariable String coll, @PathVariable String id) throws IOException, InterruptedException {
+        long ret = mdChunksService.deleteByIds(coll, List.of(id));;
         return R.data(ret);
     }
 

+ 70 - 0
server/src/main/java/com/giantan/data/mds/controller/CollectionController.java

@@ -0,0 +1,70 @@
+package com.giantan.data.mds.controller;
+
+
+import com.giantan.ai.common.reponse.R;
+import com.giantan.data.common.model.GBaseKeyValue;
+import com.giantan.data.mds.constant.MdConstants;
+import com.giantan.data.mds.service.impl.MdCollectionsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController("MdCollectionsController")
+@RequestMapping(MdConstants.API_PREFIX + "/collections")
+@CrossOrigin(origins = "*", maxAge = 3600)
+public class CollectionController {
+
+    @Autowired
+    MdCollectionsService mdCollectionsService;
+
+    @PostMapping
+    public R<GBaseKeyValue> createCollection(@RequestParam String name) throws Throwable {
+        return R.data(mdCollectionsService.createCollection(name));
+    }
+
+    @GetMapping
+    public R<List<GBaseKeyValue>> getAllCollections() throws Throwable {
+        return R.data(mdCollectionsService.getAllCollections());
+    }
+
+    @GetMapping("/{name}")
+    public R<GBaseKeyValue> getCollectionById(@PathVariable String name) throws Throwable {
+        return R.data(mdCollectionsService.getKvByName(name));
+    }
+
+    @DeleteMapping("/{name}")
+    public R<Long> deleteCollection(@PathVariable String name) throws Throwable {
+        // long ret = collectionService.deleteCollection(id);
+        long ret = mdCollectionsService.deleteCollection(name);
+        return R.data(ret);
+    }
+
+    @DeleteMapping("/{name}/all")
+    public R<Long> clearCollection(@PathVariable String name) throws Throwable {
+        // long ret = collectionService.deleteCollection(id);
+        long ret = mdCollectionsService.clearCollection(name);
+        return R.data(ret);
+    }
+
+    @PutMapping("/{name}")
+    public R<GBaseKeyValue> update(@PathVariable String name, @RequestBody Map<String, Object> kvs) throws Throwable {
+        return R.data(mdCollectionsService.updateCollection(name, kvs));
+    }
+
+    @GetMapping("/{name}/attributes")
+    public R<Map<String, Object>> getAttributes(@PathVariable String name) throws Throwable {
+        return R.data(mdCollectionsService.getCollectionAttributes(name));
+    }
+
+    @PutMapping("/{name}/attributes")
+    public R<Map<String, Object>> updateAttributes(@PathVariable String name, @RequestBody Map<String, Object> attributes) throws Throwable {
+        return R.data(mdCollectionsService.updateCollectionAttributes(name, attributes));
+    }
+
+    @DeleteMapping("/{name}/attributes")
+    public R<Map<String, Object>> removeAttribute(@PathVariable String name, @RequestParam List<String> keys) throws Throwable {
+        return R.data(mdCollectionsService.removeCollectionAttribute(name, keys));
+    }
+}

+ 16 - 10
server/src/main/java/com/giantan/data/mds/controller/MdCollsSearchController.java → server/src/main/java/com/giantan/data/mds/controller/CollsSearchController.java

@@ -1,18 +1,18 @@
 package com.giantan.data.mds.controller;
 
 import com.giantan.ai.common.reponse.R;
+import com.giantan.data.common.model.CollSearchRequest;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.index.dto.DocSearchResp;
 import com.giantan.data.mds.constant.MdConstants;
 import com.giantan.data.common.model.CollsSearchRequest;
 import com.giantan.data.mds.service.impl.MdCollsSearchService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 /*
 public class CollsSearchRequest {
@@ -31,17 +31,23 @@ public class CollsSearchRequest {
 }
  */
 
-@RestController
-@RequestMapping(MdConstants.API_PREFIX + "/collections/_search")
-public class MdCollsSearchController {
+@RestController("MdCollsSearchController")
+@RequestMapping(MdConstants.API_PREFIX + "/collections")
+public class CollsSearchController {
 
     @Autowired
     MdCollsSearchService mdSearchService;
 
-    @PostMapping()
-    public ResponseEntity<R> federatedSearch(@RequestBody CollsSearchRequest query) throws Throwable {
+    @PostMapping("/_search")
+    public R<List<DocSearchResp>> federatedSearch(@RequestBody CollsSearchRequest query) throws Throwable {
         List<DocSearchResp> rets = mdSearchService.federatedSearch(query);
-        return ResponseEntity.ok(R.data(rets));
+        return R.data(rets);
     }
 
+    @PostMapping("/{name}/_search")
+    public R<List<DocSearchResp>> hybridSearch(@PathVariable String name,
+                                               @RequestBody CollSearchRequest query) throws Throwable {
+        List<DocSearchResp> rets = mdSearchService.collSearch(name, query);
+        return R.data(rets);
+    }
 }

+ 55 - 55
server/src/main/java/com/giantan/data/mds/controller/MdDocsController.java → server/src/main/java/com/giantan/data/mds/controller/DocController.java

@@ -1,19 +1,16 @@
 package com.giantan.data.mds.controller;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.mds.constant.MdConstants;
 import com.giantan.data.mds.service.*;
 import com.giantan.data.mds.service.impl.FileProcessingService;
 import com.giantan.data.mds.service.impl.MdFileTaskStatusManager;
 import com.giantan.data.tasks.TaskStatus;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.FileAlreadyExistsException;
 import java.util.List;
@@ -50,9 +47,9 @@ import java.util.UUID;
 // - `POST /collections/{collId}/mds/actions/{action}`:简洁直观,表示“对资源集合执行动作”
 //- 配合 `mdIds` 或标签、筛选条件等参数进行部分操作
 
-@RestController
-@RequestMapping(MdConstants.API_PREFIX + "/collections/{collId}")
-public class MdDocsController {
+@RestController("MdDocsController")
+@RequestMapping(MdConstants.API_PREFIX + "/collections/{coll}")
+public class DocController {
     private static final org.slf4j.Logger log
             = org.slf4j.LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -88,7 +85,7 @@ public class MdDocsController {
     //@PostMapping("/upload")
     //objectPath 如果以"/"结尾就是path,否则是文件名
     @PostMapping("/mds")
-    public R<Map<String, Object>> upload(@PathVariable String collId,
+    public R<Map<String, Object>> upload(@PathVariable String coll,
                                          @RequestParam("file") MultipartFile file,
                                          @RequestParam Map<String, String> params
     ) {
@@ -97,7 +94,7 @@ public class MdDocsController {
         //System.out.println("file = " + file.getOriginalFilename());
         log.info("上传文件: {}, taskId: {}", file.getOriginalFilename(), taskId);
         try {
-            Map<String, Object> ret = mdDocsService.processAsyncDirect(collId, taskId, file, params);
+            Map<String, Object> ret = mdDocsService.processAsyncDirect(coll, taskId, file, params);
             return R.data(ret);
         } catch (FileAlreadyExistsException e) {
             log.error("上传文件: {} 失败, taskId: {}", file.getOriginalFilename(), taskId);
@@ -109,7 +106,7 @@ public class MdDocsController {
     }
 
     @DeleteMapping("/mds/{gid}")
-    public R<?> delete(@PathVariable String collId, @PathVariable String gid
+    public R<Map> delete(@PathVariable String coll, @PathVariable String gid
     ) throws Throwable {
         //String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
@@ -118,23 +115,23 @@ public class MdDocsController {
         //taskStatusManager.putProcessing(taskId, new TaskStatus(collId, taskId, "处理中", "", System.currentTimeMillis(), 0));
         //fileProcessingService.processAsyncDirect(collId, taskId, file, params);
         //System.out.println("params = " + params);
-        int deleted = mdDocsService.deleteByMdid(collId, gid);
+        int deleted = mdDocsService.deleteByMdid(coll, gid);
         log.info("删除文件: {}", gid);
         //log.info("taskId = " + taskId);
         return R.data(Map.of("deleted", deleted));
     }
 
     @GetMapping("/mds/{id}")
-    public R<?> getById(@PathVariable String collId, @PathVariable String id
+    public R<GBaseKeyValue> getById(@PathVariable String coll, @PathVariable String id
     ) throws Throwable {
-        GBaseKeyValue ret = mdDocsService.findByMdid(collId, id);
+        GBaseKeyValue ret = mdDocsService.findByMdid(coll, id);
         return R.data(ret);
     }
 
     @GetMapping("/mds/by-name")
-    public R<?> getByName(@PathVariable String collId, @RequestParam("name") String name
+    public R<GBaseKeyValue> getByName(@PathVariable String coll, @RequestParam("name") String name
     ) throws Throwable {
-        GBaseKeyValue ret = mdDocsService.findByName(collId, name);
+        GBaseKeyValue ret = mdDocsService.findByName(coll, name);
         return R.data(ret);
     }
 
@@ -150,8 +147,8 @@ public class MdDocsController {
 //    }
 
     @DeleteMapping("/mds/all")
-    public R<Map<String, Object>> deleteAll(@PathVariable String collId) throws Exception {
-        long removed = mdDocsService.deleteAll(collId);
+    public R<Map<String, Object>> deleteAll(@PathVariable String coll) throws Exception {
+        long removed = mdDocsService.deleteAll(coll);
         return R.data(Map.of("deleted", removed));
     }
 
@@ -166,21 +163,13 @@ public class MdDocsController {
 //        return ResponseEntity.ok(status);
 //    }
 
-    public R<TaskStatus> getStatus(@PathVariable String collId, @PathVariable String taskId) {
+    public R<TaskStatus> getStatus(@PathVariable String coll, @PathVariable String taskId) {
         TaskStatus status = taskStatusManager.get(taskId);
         return R.data(status);
     }
 
     @DeleteMapping("/upload-tasks/{taskId}")
-//    public ResponseEntity<Map<String, Object>> deleteStatus(@PathVariable String taskId) {
-//        boolean removed = taskStatusManager.delete(taskId);
-//        return ResponseEntity.ok(Map.of(
-//                "taskId", taskId,
-//                "removed", removed
-//        ));
-//    }
-
-    public R<Map<String, Object>> deleteStatus(@PathVariable String taskId) {
+    public R<Map<String, Object>> deleteStatus(@PathVariable String coll, @PathVariable String taskId) {
         boolean removed = taskStatusManager.delete(taskId);
         return R.data(Map.of(
                 "taskId", taskId,
@@ -216,27 +205,38 @@ public class MdDocsController {
 //    }
 
     @PostMapping("/mds/locate")
-    public R<?> locateText(
-            @PathVariable String collId,
+    public R<Map<String, Object>> locateText(
+            @PathVariable String coll,
             @RequestBody Map<String, Object> req
     ) throws Throwable {
-        Map<String, Object> r = mdDocsService.locateText(collId, req);
+        Map<String, Object> r = mdDocsService.locateText(coll, req);
         return R.data(r);
     }
 
 
     @PostMapping("/mds/locateByHeadings")
-    public R<?> locateByHeadings(
-            @PathVariable String collId,
+    public R<Map<String, Object>> locateByHeadings(
+            @PathVariable String coll,
             @RequestBody Map<String, Object> req
     ) throws Throwable {
-        Map<String, Object> r = mdDocsService.locateByHeading(collId, req);
+        Map<String, Object> r = mdDocsService.locateByHeading(coll, req);
         return R.data(r);
     }
 
+    @PostMapping("/mds/sectionByChunkId")
+    public R<Map<String, Object>> getSectionByChunkId(
+            @PathVariable String coll,
+            @RequestBody Map<String, Object> req
+    ) throws Throwable {
+        Map<String, Object> r = mdDocsService.getSectionByChunkId(coll, req);
+        return R.data(r);
+    }
+
+
+
     @GetMapping("/all")
-    public R<List<GBaseKeyValue>> getAll(@PathVariable String collId) throws Throwable {
-        List<GBaseKeyValue> ret = mdDocsService.findAll(collId);
+    public R<List<GBaseKeyValue>> getAll(@PathVariable String coll) throws Throwable {
+        List<GBaseKeyValue> ret = mdDocsService.findAll(coll);
         return R.data(ret);
     }
 
@@ -245,67 +245,67 @@ public class MdDocsController {
     //单个 metadata 字段	/collections/{collId}/mds/{mdId}/metadata/{key}
 
     @GetMapping("/mds/{mdId}/metadata")
-    public R<GBaseKeyValue> getMetadataByMdid(@PathVariable String collId, @PathVariable String mdId) throws Throwable {
-        GBaseKeyValue ret = mdDocsService.findByMdid(collId, mdId);
+    public R<GBaseKeyValue> getMetadataByMdid(@PathVariable String coll, @PathVariable String mdId) throws Throwable {
+        GBaseKeyValue ret = mdDocsService.findByMdid(coll, mdId);
         return R.data(ret);
     }
 
     @GetMapping("/mds/{mdId}/metadata/{key}")
-    public R getMetadataByKey(@PathVariable String collId, @PathVariable String mdId,
+    public R getMetadataByKey(@PathVariable String coll, @PathVariable String mdId,
                               @PathVariable String key
     ) throws Throwable {
-        Object ret = mdDocsService.getMetadataByKey(collId, mdId, key);
+        Object ret = mdDocsService.getMetadataByKey(coll, mdId, key);
         return R.data(ret);
     }
 
     @PatchMapping("/mds/{mdId}/metadata")
-    public R patchMetadata(@PathVariable String collId, @PathVariable String mdId,
+    public R patchMetadata(@PathVariable String coll, @PathVariable String mdId,
                            @RequestBody GBaseKeyValue data
     ) throws Throwable {
-        Object ret = mdDocsService.patchMetadata(collId, mdId, data);
+        Object ret = mdDocsService.patchMetadata(coll, mdId, data);
         return R.data(ret);
     }
 
     @GetMapping("/mds/{mdId}/attributes")
-    public R getAttributeByKey(@PathVariable String collId, @PathVariable String mdId
+    public R getAttributeByKey(@PathVariable String coll, @PathVariable String mdId
     ) throws Throwable {
-        Object ret = mdDocsService.getAttributes(collId, mdId);
+        Object ret = mdDocsService.getAttributes(coll, mdId);
         return R.data(ret);
     }
 
     @GetMapping("/mds/{mdId}/attributes/{key}")
-    public R getAttributeByKey(@PathVariable String collId, @PathVariable String mdId,
+    public R getAttributeByKey(@PathVariable String coll, @PathVariable String mdId,
                                @PathVariable String key
     ) throws Throwable {
-        Object ret = mdDocsService.getAttributeByKey(collId, mdId, key);
+        Object ret = mdDocsService.getAttributeByKey(coll, mdId, key);
         return R.data(ret);
     }
 
     @PatchMapping("/mds/{mdId}/attributes")
-    public R patchAttributes(@PathVariable String collId, @PathVariable String mdId,
+    public R patchAttributes(@PathVariable String coll, @PathVariable String mdId,
                              @RequestBody GBaseKeyValue data
     ) throws Throwable {
-        Object ret = mdDocsService.patchAttributes(collId, mdId, data);
+        Object ret = mdDocsService.patchAttributes(coll, mdId, data);
         return R.data(ret);
     }
 
     @DeleteMapping("/mds/{mdId}/attributes/{key}")
-    public R deleteAttributeByKey(@PathVariable String collId, @PathVariable String mdId,
+    public R deleteAttributeByKey(@PathVariable String coll, @PathVariable String mdId,
                                   @PathVariable String key
     ) throws Throwable {
-        Object ret = mdDocsService.deleteAttributeByKey(collId, mdId, key);
+        Object ret = mdDocsService.deleteAttributeByKey(coll, mdId, key);
         return R.data(ret);
     }
 
     @PostMapping("/mds/{mdId}/rename")
-    public R<?> rename(@PathVariable String collId, @PathVariable String mdId, @RequestBody Map<String, Object> req
+    public R<Map<String, Object>> rename(@PathVariable String coll, @PathVariable String mdId, @RequestBody Map<String, Object> req
     ) throws Throwable {
-        Map<String, Object> r = mdDocsService.rename(collId, mdId, req);
+        Map<String, Object> r = mdDocsService.rename(coll, mdId, req);
         return R.data(r);
     }
 
     @DeleteMapping("/mds/{gid}/cascade")
-    public R<?> deleteCascade(@PathVariable String collId, @PathVariable String gid
+    public R<Map<String, Object>> deleteCascade(@PathVariable String coll, @PathVariable String gid
     ) throws Throwable {
         //String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
@@ -314,14 +314,14 @@ public class MdDocsController {
         //taskStatusManager.putProcessing(taskId, new TaskStatus(collId, taskId, "处理中", "", System.currentTimeMillis(), 0));
         //fileProcessingService.processAsyncDirect(collId, taskId, file, params);
         //System.out.println("params = " + params);
-        int deleted = mdDocsService.deleteCascadeByMdid(collId, gid);
+        int deleted = mdDocsService.deleteCascadeByMdid(coll, gid);
         log.info("删除文件,mdid: {}", gid);
         //log.info("taskId = " + taskId);
         return R.data(Map.of("deleted", deleted));
     }
 
     @DeleteMapping("/mds/{gid}/indexes")
-    public R<?> deleteIndexes(@PathVariable String collId, @PathVariable String gid
+    public R<Map<String, Object>> deleteIndexes(@PathVariable String coll, @PathVariable String gid
     ) throws Throwable {
         //String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
@@ -330,7 +330,7 @@ public class MdDocsController {
         //taskStatusManager.putProcessing(taskId, new TaskStatus(collId, taskId, "处理中", "", System.currentTimeMillis(), 0));
         //fileProcessingService.processAsyncDirect(collId, taskId, file, params);
         //System.out.println("params = " + params);
-        int deleted = mdDocsService.deleteIndexesByMdid(collId, gid);
+        int deleted = mdDocsService.deleteIndexesByMdid(coll, gid);
         log.info("删除索引文件,mdid: {}", gid);
         //log.info("taskId = " + taskId);
         return R.data(Map.of("deleted", deleted));

+ 3 - 3
server/src/main/java/com/giantan/data/mds/controller/DownloadController.java

@@ -15,7 +15,7 @@ import java.net.URLConnection;
 import java.nio.charset.StandardCharsets;
 
 @RestController
-@RequestMapping(MdConstants.API_PREFIX + "/collections/{collId}")
+@RequestMapping(MdConstants.API_PREFIX + "/collections/{coll}")
 public class  DownloadController {
 
     @Autowired
@@ -23,14 +23,14 @@ public class  DownloadController {
 
 
     @GetMapping("/mds/{gid}/download")
-    public void downloadFile(@PathVariable String collId, @PathVariable String gid, @RequestParam String filename, HttpServletResponse response) throws Throwable {
+    public void downloadFile(@PathVariable String coll, @PathVariable String gid, @RequestParam String filename, HttpServletResponse response) throws Throwable {
 
         //String repository = collId;//String fromObject = getObjectPath(collId, gid);
 
         //如果你希望支持 预览(如 Markdown 在线预览) 而不是下载,可以把 Content-Disposition 改成:
         //response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
 
-        try (InputStream stream = mdFilesService.download(collId, gid)) {
+        try (InputStream stream = mdFilesService.download(coll, gid)) {
 
             String contentType = URLConnection.guessContentTypeFromName(filename);
             if (contentType == null) contentType = "application/octet-stream";

+ 0 - 71
server/src/main/java/com/giantan/data/mds/controller/MdCollectionsController.java

@@ -1,71 +0,0 @@
-package com.giantan.data.mds.controller;
-
-
-import com.giantan.ai.common.reponse.R;
-import com.giantan.data.mds.constant.MdConstants;
-import com.giantan.data.mds.service.impl.MdCollectionsService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-@RestController
-//@RequestMapping("/v1/api/entry-groups")
-@RequestMapping(MdConstants.API_PREFIX+"/collections")
-@CrossOrigin(origins = "*", maxAge = 3600)
-public class MdCollectionsController {
-
-    @Autowired
-    MdCollectionsService mdCollectionsService;
-
-    @PostMapping
-    public ResponseEntity<R> createCollection(@RequestParam String name) throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.createCollection(name)));
-    }
-
-    @GetMapping
-    public ResponseEntity<R> getAllCollections() throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.getAllCollections()));
-    }
-
-    @GetMapping("/{name}")
-    public ResponseEntity<R> getCollectionById(@PathVariable String name) throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.getKvByName(name)));
-    }
-
-    @DeleteMapping("/{name}")
-    public ResponseEntity<R> deleteCollection(@PathVariable String name) throws Throwable {
-       // long ret = collectionService.deleteCollection(id);
-        long ret = mdCollectionsService.deleteCollection(name);
-        return ResponseEntity.ok(R.data(ret));
-    }
-
-    @DeleteMapping("/{name}/all")
-    public ResponseEntity<R> clearCollection(@PathVariable String name) throws Throwable {
-        // long ret = collectionService.deleteCollection(id);
-        long ret = mdCollectionsService.clearCollection(name);
-        return ResponseEntity.ok(R.data(ret));
-    }
-
-    @PutMapping("/{name}")
-    public ResponseEntity<R> update(@PathVariable String name,  @RequestBody Map<String,Object> kvs) throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.updateCollection(name,kvs)));
-    }
-
-    @GetMapping("/{name}/attributes")
-    public ResponseEntity<R> getAttributes(@PathVariable String name) throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.getCollectionAttributes(name)));
-    }
-
-    @PutMapping("/{name}/attributes")
-    public ResponseEntity<R> updateAttributes(@PathVariable String name,  @RequestBody Map<String,Object> attributes) throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.updateCollectionAttributes(name,attributes)));
-    }
-
-    @DeleteMapping("/{name}/attributes")
-    public ResponseEntity<R> removeAttribute(@PathVariable String name,@RequestBody List<String> keys) throws Throwable {
-        return ResponseEntity.ok(R.data(mdCollectionsService.removeCollectionAttribute(name,keys)));
-    }
-}

+ 1 - 1
server/src/main/java/com/giantan/data/mds/controller/ProxySearchContoller.java

@@ -18,7 +18,7 @@ import org.springframework.web.client.RestTemplate;
 import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 
-@RestController
+@RestController("MdProxySearchContoller")
 @RequestMapping(MdConstants.API_PREFIX + "/collections/{coll}")
 public class ProxySearchContoller {
     private static final org.slf4j.Logger log

+ 5 - 4
server/src/main/java/com/giantan/data/mds/controller/StatusController.java

@@ -1,5 +1,6 @@
 package com.giantan.data.mds.controller;
 
+import com.giantan.ai.common.reponse.R;
 import com.zaxxer.hikari.HikariDataSource;
 import jakarta.annotation.PostConstruct;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -10,7 +11,7 @@ import java.lang.invoke.MethodHandles;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-@RestController
+@RestController("MdStatusController")
 @RequestMapping("/v1/server")
 public class StatusController {
     private static final org.slf4j.Logger log
@@ -36,16 +37,16 @@ public class StatusController {
     }
 
     @GetMapping("/hikari/status")
-    public Map<String, Object> getStatus() {
+    public R<Map<String, Object>> getStatus() {
         var mxBean = dataSource.getHikariPoolMXBean();
         if (mxBean == null) {
-            return Map.of("status", "HikariDataSource not initialized yet");
+            return R.data(Map.of("status", "HikariDataSource not initialized yet"));
         }
         LinkedHashMap<String, Object> map = new LinkedHashMap<>();
         map.put("total", mxBean.getTotalConnections());
         map.put("active", mxBean.getActiveConnections());
         map.put("idle", mxBean.getIdleConnections());
         map.put("waiting", mxBean.getThreadsAwaitingConnection());
-        return map;
+        return R.data(map);
     }
 }

+ 26 - 25
server/src/main/java/com/giantan/data/mds/controller/TaskController.java

@@ -4,7 +4,8 @@ import com.giantan.ai.common.reponse.R;
 import com.giantan.data.mds.constant.MdConstants;
 import com.giantan.data.mds.service.impl.MdTaskManager;
 import com.giantan.data.tasks.*;
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskContext;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -13,8 +14,8 @@ import org.springframework.web.bind.annotation.*;
 import java.time.LocalDateTime;
 import java.util.*;
 
-@RestController
-@RequestMapping(MdConstants.API_PREFIX + "/collections/{collId}/tasks")
+@RestController("MdTaskController")
+@RequestMapping(MdConstants.API_PREFIX + "/collections/{coll}/tasks")
 public class TaskController {
 
     @Autowired
@@ -35,7 +36,7 @@ public class TaskController {
      */
 
     @PostMapping("/submit")
-    public R<Map> submit(@PathVariable String collId, @RequestBody Map<String, Object> payload) {
+    public R<Map> submit(@PathVariable String coll, @RequestBody Map<String, Object> payload) {
         String t = (String) payload.remove("type");
 
         TaskType type = TaskType.valueOf(t);
@@ -58,60 +59,60 @@ public class TaskController {
         //Map<String, Object> params = (Map<String, Object>) payload.getOrDefault("params", new HashMap<>());
         Map<String, Object> params = new HashMap<>(payload);
 
-        String ret = manager.submit(collId, type, params);
+        String ret = manager.submit(coll, type, params);
         return R.data(Map.of("taskId", ret));
     }
 
     @PostMapping("/{id}/cancel")
-    public R<Map> cancel(@PathVariable String collId, @PathVariable String id) {
-        boolean ok = manager.cancel(collId, id);
+    public R<Map> cancel(@PathVariable String coll, @PathVariable String id) {
+        boolean ok = manager.cancel(coll, id);
         return R.data(Map.of("canceled", ok));
     }
 
     @DeleteMapping("/{id}")
-    public R<Map> delete(@PathVariable String collId, @PathVariable String id) {
-        boolean ok = manager.delete(collId, id);
+    public R<Map> delete(@PathVariable String coll, @PathVariable String id) {
+        boolean ok = manager.delete(coll, id);
         return R.data(Map.of("deleted", ok));
     }
 
     @GetMapping("/{id}/status")
-    public R<Map> status(@PathVariable String collId, @PathVariable String id) {
-        TaskContext ctx = manager.getTask(collId, id);
+    public R<Map> status(@PathVariable String coll, @PathVariable String id) {
+        TaskContext ctx = manager.getTask(coll, id);
         Map ret = ctx != null ? ctx.getObjectStatus() : Collections.emptyMap();
         return R.data(ret);
     }
 
     @GetMapping("/{id}")
-    public R<TaskContext> getTask(@PathVariable String collId, @PathVariable String id) {
-        TaskContext task = manager.getTask(collId, id);
+    public R<TaskContext> getTask(@PathVariable String coll, @PathVariable String id) {
+        TaskContext task = manager.getTask(coll, id);
         return R.data(task);
     }
 
     @DeleteMapping("/cleanup")
-    public R<Map> cleanup(@PathVariable String collId) {
-        int r = manager.cleanupNow(collId);
+    public R<Map> cleanup(@PathVariable String coll) {
+        int r = manager.cleanupNow(coll);
         //return ResponseEntity.ok("Task cleanup triggered.");
         return R.data(Map.of("deleted", r));
     }
 
     @GetMapping
-    public R<Collection<TaskContext>> listAllTasks(@PathVariable String collId) {
-        return R.data(manager.allTasks(collId));
+    public R<Collection<TaskContext>> listAllTasks(@PathVariable String coll) {
+        return R.data(manager.allTasks(coll));
     }
 
     @GetMapping("/status/{status}")
-    public R<Collection<TaskContext>> listTasksByStatus(@PathVariable String collId, @PathVariable String status) {
+    public R<Collection<TaskContext>> listTasksByStatus(@PathVariable String coll, @PathVariable String status) {
         //TaskStatus statusEnum = TaskStatus.valueOf(status.toUpperCase());
-        return R.data(manager.findByStatus(collId, status));
+        return R.data(manager.findByStatus(coll, status));
     }
 
     @GetMapping("/{id}/history")
-    public R<TaskStatusHistory> getHistoryTask(@PathVariable String collId, @PathVariable String id){
-        return R.data(manager.getHistoryTask(collId, id));
+    public R<TaskStatusHistory> getHistoryTask(@PathVariable String coll, @PathVariable String id){
+        return R.data(manager.getHistoryTask(coll, id));
     }
 
     @GetMapping("/history")
-    public R<List<TaskStatusHistory>> getTasks(@PathVariable String collId,
+    public R<List<TaskStatusHistory>> getTasks(@PathVariable String coll,
                                             @RequestParam(value = "createdAtStart", required = false) String createdAtStart,
                                             @RequestParam(value = "createdAtEnd", required = false) String createdAtEnd,
                                             @RequestParam(value = "status", required = false) String status
@@ -125,11 +126,11 @@ public class TaskController {
         if (createdAtEnd != null) {
             endTime = LocalDateTime.parse(createdAtEnd);
         }
-        return R.data(manager.getHistoryTasks(collId, startTime, endTime, status));
+        return R.data(manager.getHistoryTasks(coll, startTime, endTime, status));
     }
 
     @DeleteMapping("/history/cleanup")
-    public R deleteHistory(@PathVariable String collId,
+    public R<Integer> deleteHistory(@PathVariable String coll,
                              @RequestParam(value = "createdAtStart", required = false) String createdAtStart,
                              @RequestParam(value = "createdAtEnd", required = false) String createdAtEnd,
                              @RequestParam(value = "status", required = false) String status
@@ -143,7 +144,7 @@ public class TaskController {
         if (createdAtEnd != null) {
             endTime = LocalDateTime.parse(createdAtEnd);
         }
-        return R.data(manager.deleteHistoryTasks(collId, startTime, endTime, status));
+        return R.data(manager.deleteHistoryTasks(coll, startTime, endTime, status));
     }
 
 }

+ 27 - 27
server/src/main/java/com/giantan/data/mds/controller/TaxonomyController.java

@@ -1,7 +1,7 @@
 package com.giantan.data.mds.controller;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.mds.constant.MdConstants;
 import com.giantan.data.mds.service.impl.MdTaxonomyService;
 import com.giantan.data.taxonomy.model.TaxonomyNode;
@@ -15,8 +15,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-@RestController
-@RequestMapping(MdConstants.API_PREFIX + "/collections/{collName}/taxonomy")
+@RestController("MdTaxonomyController")
+@RequestMapping(MdConstants.API_PREFIX + "/collections/{coll}/taxonomy")
 public class TaxonomyController {
     private static final org.slf4j.Logger log
             = org.slf4j.LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -29,8 +29,8 @@ public class TaxonomyController {
 //        List<TaxonomyNode> r = dynamicTaxonomyService.listAll(collName);
 //        return ResponseEntity.ok(r);
 //    }
-    public R listAll(@PathVariable String collName) {
-        List<TaxonomyNode> r = dynamicTaxonomyService.listAll(collName);
+    public R<List<TaxonomyNode>> listAll(@PathVariable String coll) {
+        List<TaxonomyNode> r = dynamicTaxonomyService.listAll(coll);
         return R.data(r);
     }
 
@@ -40,8 +40,8 @@ public class TaxonomyController {
 //        List<TaxonomyNode> r = dynamicTaxonomyService.listTree(collName);
 //        return ResponseEntity.ok(r);
 //    }
-    public R listTree(@PathVariable String collName) {
-        List<TaxonomyNode> r = dynamicTaxonomyService.listTree(collName);
+    public R<List<TaxonomyNode>> listTree(@PathVariable String coll) {
+        List<TaxonomyNode> r = dynamicTaxonomyService.listTree(coll);
         return R.data(r);
     }
 
@@ -51,8 +51,8 @@ public class TaxonomyController {
 //        List<TaxonomyNode> r = dynamicTaxonomyService.findChildren(collName, nodeId);
 //        return ResponseEntity.ok(r);
 //    }
-    public R findChildren(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
-        List<TaxonomyNode> r = dynamicTaxonomyService.findChildren(collName, nodeId);
+    public R<List<TaxonomyNode>> findChildren(@PathVariable String coll, @PathVariable String nodeId) throws Exception {
+        List<TaxonomyNode> r = dynamicTaxonomyService.findChildren(coll, nodeId);
         return R.data(r);
     }
 
@@ -61,8 +61,8 @@ public class TaxonomyController {
 //        List<GBaseKeyValue> r = dynamicTaxonomyService.findMds(collName, nodeId);
 //        return ResponseEntity.ok(r);
 //    }
-    public R findMds(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
-        List<GBaseKeyValue> r = dynamicTaxonomyService.findMds(collName, nodeId);
+    public R<List<GBaseKeyValue>> findMds(@PathVariable String coll, @PathVariable String nodeId) throws Exception {
+        List<GBaseKeyValue> r = dynamicTaxonomyService.findMds(coll, nodeId);
         return R.data(r);
     }
 
@@ -72,14 +72,14 @@ public class TaxonomyController {
 //        TaxonomyNode r = dynamicTaxonomyService.createNode(collName, data);
 //        return ResponseEntity.ok(r);
 //    }
-    public R createNode(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
-        TaxonomyNode r = dynamicTaxonomyService.createNode(collName, data);
+    public R<TaxonomyNode> createNode(@PathVariable String coll, @RequestBody Map<String, Object> data) throws Exception {
+        TaxonomyNode r = dynamicTaxonomyService.createNode(coll, data);
         return R.data(r);
     }
 
 
     @PostMapping("/{nodeId}/mds")
-    public R upload(@PathVariable String collName,
+    public R<Map<String, Object>> upload(@PathVariable String coll,
                                          @PathVariable String nodeId,
                                          @RequestParam("file") MultipartFile file,
                                          @RequestParam Map<String, String> params
@@ -90,7 +90,7 @@ public class TaxonomyController {
         log.info("上传文件: {}, taskId: {}", file.getOriginalFilename(), taskId);
 
         try {
-            Map<String, Object> ret = dynamicTaxonomyService.processAsyncDirect(collName, nodeId, taskId, file, params);
+            Map<String, Object> ret = dynamicTaxonomyService.processAsyncDirect(coll, nodeId, taskId, file, params);
             return R.data(ret);
         }catch (FileAlreadyExistsException e){
             log.error("上传文件: {} 失败, taskId: {}", file.getOriginalFilename(), taskId);
@@ -102,59 +102,59 @@ public class TaxonomyController {
     }
 
     @DeleteMapping("/{nodeId}/mds")
-    public R deleteFolder(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<Integer> deleteFolder(@PathVariable String coll, @PathVariable String nodeId) throws Exception {
         String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
         //System.out.println("file = " + file.getOriginalFilename());
         //log.info("上传文件: {}, taskId: {}", file.getOriginalFilename(), taskId);
 
         //taskStatusManager.putProcessing(taskId, new TaskStatus(collId, taskId, "处理中", "", System.currentTimeMillis(), 0));
-        int ret = dynamicTaxonomyService.deleteFolder(collName, nodeId, taskId);
+        int ret = dynamicTaxonomyService.deleteFolder(coll, nodeId, taskId);
 
         return R.data(ret);
     }
 
     @PostMapping("/{nodeId}/rename")
-    public R renameFolder(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
+    public R<Integer> renameFolder(@PathVariable String coll, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
         String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
         //System.out.println("file = " + file.getOriginalFilename());
         //log.info("上传文件: {}, taskId: {}", file.getOriginalFilename(), taskId);
 
         //taskStatusManager.putProcessing(taskId, new TaskStatus(collId, taskId, "处理中", "", System.currentTimeMillis(), 0));
-        int ret = dynamicTaxonomyService.renameFolder(collName, nodeId, req, taskId);
+        int ret = dynamicTaxonomyService.renameFolder(coll, nodeId, req, taskId);
 
         return R.data(ret);
     }
 
     @PostMapping("/{nodeId}/move")
-    public R moveTo(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
+    public R<Integer> moveTo(@PathVariable String coll, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
         String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
         //System.out.println("file = " + file.getOriginalFilename());
         //log.info("上传文件: {}, taskId: {}", file.getOriginalFilename(), taskId);
 
         //taskStatusManager.putProcessing(taskId, new TaskStatus(collId, taskId, "处理中", "", System.currentTimeMillis(), 0));
-        int ret = dynamicTaxonomyService.moveTo(collName, nodeId, req, taskId);
+        int ret = dynamicTaxonomyService.moveTo(coll, nodeId, req, taskId);
 
         return R.data(ret);
     }
 
     @GetMapping("/{nodeId}/subtree")
-    public R getSubtree(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
-        List<TaxonomyNode> r = dynamicTaxonomyService.findSubtree(collName, nodeId);
+    public R<List<TaxonomyNode>> getSubtree(@PathVariable String coll, @PathVariable String nodeId) throws Exception {
+        List<TaxonomyNode> r = dynamicTaxonomyService.findSubtree(coll, nodeId);
         return R.data(r);
     }
 
     @GetMapping("/{nodeId}/descendants")
-    public R getDescendants(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
-        List<TaxonomyNode> r = dynamicTaxonomyService.findDescendants(collName, nodeId);
+    public R<List<TaxonomyNode>> getDescendants(@PathVariable String coll, @PathVariable String nodeId) throws Exception {
+        List<TaxonomyNode> r = dynamicTaxonomyService.findDescendants(coll, nodeId);
         return R.data(r);
     }
 
     @GetMapping("/{nodeId}/ancestors")
-    public R getAncestors(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
-        List<TaxonomyNode> r = dynamicTaxonomyService.findAncestors(collName, nodeId);
+    public R<List<TaxonomyNode>> getAncestors(@PathVariable String coll, @PathVariable String nodeId) throws Exception {
+        List<TaxonomyNode> r = dynamicTaxonomyService.findAncestors(coll, nodeId);
         return R.data(r);
     }
 }

+ 0 - 3
server/src/main/java/com/giantan/data/mds/repository/MdDynamicChunkRepository.java

@@ -1,14 +1,11 @@
 package com.giantan.data.mds.repository;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
 import com.giantan.data.mds.chunk.DynamicChunkRepository;
 import jakarta.annotation.PostConstruct;
 
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Repository;
 
-import java.util.List;
-
 @Repository
 public class MdDynamicChunkRepository extends DynamicChunkRepository {
     private static final org.slf4j.Logger log

+ 5 - 0
server/src/main/java/com/giantan/data/mds/repository/MdIndexer.java

@@ -161,4 +161,9 @@ public class MdIndexer extends HybridIndexer {
     public Map<String, List<DocSearchResp>> federatedSearch(Map<String, Object> req) throws IOException, InterruptedException {
         return hybridSearch.federatedSearch(req);
     }
+
+    public List<DocSearchResp> hybridSearch(String coll, Map<String, Object> req, boolean isIncludeColl) throws IOException, InterruptedException {
+        return hybridSearch.hybridSearch(coll, req, isIncludeColl);
+    }
+
 }

+ 1 - 1
server/src/main/java/com/giantan/data/mds/service/IDynamicDocService.java

@@ -1,6 +1,6 @@
 package com.giantan.data.mds.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import java.util.List;
 import java.util.Map;

+ 0 - 2
server/src/main/java/com/giantan/data/mds/service/IMdChunksService.java

@@ -1,8 +1,6 @@
 package com.giantan.data.mds.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
 import com.giantan.data.mds.chunk.MdChunk;
-import org.cnnlp.data.document.GDocument;
 
 import java.io.IOException;
 import java.util.List;

+ 3 - 2
server/src/main/java/com/giantan/data/mds/service/IMdDocsService.java

@@ -1,9 +1,8 @@
 package com.giantan.data.mds.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -51,6 +50,8 @@ public interface IMdDocsService {
 
     Map<String, Object> locateByHeading(String coll, Map<String, Object> req) throws Throwable;
 
+    Map<String, Object> getSectionByChunkId(String coll, Map<String, Object> req) throws Throwable;
+
     int deleteCascadeByMdid(String coll, String gid) throws Throwable;
 
     int deleteIndexesByMdid(String coll, String gid) throws Throwable;

+ 1 - 2
server/src/main/java/com/giantan/data/mds/service/IMdFilesService.java

@@ -1,8 +1,7 @@
 package com.giantan.data.mds.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
-import java.io.IOException;
 import java.io.InputStream;
 
 public interface IMdFilesService {

+ 1 - 1
server/src/main/java/com/giantan/data/mds/service/impl/MdCollectionsService.java

@@ -1,6 +1,6 @@
 package com.giantan.data.mds.service.impl;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.kvs.repository.GRepository;
 import com.giantan.data.mds.repository.*;

+ 47 - 10
server/src/main/java/com/giantan/data/mds/service/impl/MdCollsSearchService.java

@@ -1,15 +1,19 @@
 package com.giantan.data.mds.service.impl;
 
 import cnnlp.util.MultiValueHashMap;
+import com.giantan.data.common.model.CollSearchRequest;
 import com.giantan.data.common.model.CollsSearchRequest;
+import com.giantan.data.common.model.GBaseKeyValue;
+import com.giantan.data.index.HybridIndexer;
 import com.giantan.data.index.dto.DocSearchResp;
 import com.giantan.data.mds.repository.MdDynamicRepository;
 import com.giantan.data.mds.repository.MdIndexer;
+import com.giantan.data.mds.util.NlpTools;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.util.*;
-import java.util.stream.Collectors;
 
 @Service
 public class MdCollsSearchService {
@@ -17,10 +21,10 @@ public class MdCollsSearchService {
             = org.slf4j.LoggerFactory.getLogger(MdCollsSearchService.class);
 
     @Autowired
-    MdCollectionsService qaCollectionService;
+    MdCollectionsService mdCollectionService;
 
     @Autowired
-    MdDynamicRepository qaDocRepository;
+    MdDynamicRepository mdRepository;
 
     @Autowired
     MdIndexer hybridSearch;
@@ -37,14 +41,14 @@ public class MdCollsSearchService {
         if (colls == null || colls.isEmpty()) {
             throw new RuntimeException("No collections found");
         }
-        List<DocSearchResp> rets = new ArrayList<>();
+        final List<DocSearchResp> rets = new ArrayList<>();
 
         MultiValueHashMap mapping = new MultiValueHashMap();
 
         List<String> collNames = new ArrayList<>();
         for (String coll : colls) {
             String collId = getStrOfCollId(coll);
-            String qasCollName = qaDocRepository.getMappingCollection(collId);
+            String qasCollName = mdRepository.getMappingCollection(collId);
             collNames.add(qasCollName);
             mapping.put(qasCollName, collId);
         }
@@ -73,18 +77,24 @@ public class MdCollsSearchService {
                 double sb = toScore(b.getScore());
                 return Double.compare(sb, sa);
             });
+
+            if (req.getTopK() != null && rets.size() > req.getTopK()) {
+                List<DocSearchResp> rets2 = rets.subList(0, req.getTopK());
+                return rets2;
+            }
         }
+
         return rets;
     }
 
-    private String toCollStr(Object o){
+    private String toCollStr(Object o) {
         if (o instanceof String) {
             return (String) o;
-        }else if (o instanceof Double) {
+        } else if (o instanceof Double) {
             Double d = (Double) o;
             String s = String.valueOf(d.longValue());
             return s;
-        }else if (o instanceof Integer) {
+        } else if (o instanceof Integer) {
             return String.valueOf(o);
         }
         return String.valueOf(o);
@@ -105,7 +115,7 @@ public class MdCollsSearchService {
                 if (o != null) {
                     String collId1 = toCollStr(o);
                     if (collSet.contains(collId1)) {
-                        String collectionName = qaCollectionService.getCollectionName(toDocId(collId1));
+                        String collectionName = mdCollectionService.getCollectionName(toDocId(collId1));
                         metadata.put(MdIndexer.COLL_NAME, collectionName);
                         rets.add(resp);
                     }
@@ -168,7 +178,7 @@ public class MdCollsSearchService {
 //    }
 
     protected String getStrOfCollId(String coll) {
-        int id = qaCollectionService.getCollectionId(coll);
+        int id = mdCollectionService.getCollectionId(coll);
         if (id <= 0) {
             return null;
         }
@@ -215,6 +225,33 @@ public class MdCollsSearchService {
         }
     }
 
+    public List<DocSearchResp> collSearch(String coll, CollSearchRequest query) throws IOException, InterruptedException {
+        String collId = getStrOfCollId(coll);
+        String qasCollName = mdRepository.getMappingCollection(collId);
+        Map<String, Object> req = query.toMap();
+
+        List<DocSearchResp> resps = hybridSearch.hybridSearch(qasCollName, req, false);
+
+        if (resps != null && !resps.isEmpty() && query.getMaxContentLength() != null) {
+            int maxlength = query.getMaxContentLength();
+            String q = query.getQuery();
+            for (DocSearchResp resp : resps) {
+                String text = resp.getText();
+                if (text.length() > maxlength) {
+                    String text2 = NlpTools.generateSnippet(text, q, maxlength);
+                    resp.setText(text2);
+                }
+            }
+
+            if (query.getTopK() != null && resps.size() > query.getTopK()) {
+                List<DocSearchResp> rets2 = resps.subList(0, query.getTopK());
+                return rets2;
+            }
+        }
+        return resps;
+
+    }
+
 //    protected List<GBaseKeyValue> getEntitiesBySearch(String collId, String q, List<DocSearchResp> resps) throws Throwable {
 //        if (resps.isEmpty()) {
 //            return List.of();

+ 110 - 17
server/src/main/java/com/giantan/data/mds/service/impl/MdDocsService.java

@@ -1,9 +1,12 @@
 package com.giantan.data.mds.service.impl;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.ai.common.reponse.R;
+import com.giantan.data.common.model.GBaseKeyValue;
+import com.giantan.data.mds.chunk.MdChunk;
 import com.giantan.data.mds.repository.MdDynamicChunkRepository;
 import com.giantan.data.mds.repository.MdDynamicRepository;
 import com.giantan.data.mds.repository.MdIndexer;
+import com.giantan.data.mds.service.IMdChunksService;
 import com.giantan.data.mds.service.IMdDocsService;
 import com.giantan.gfs.service.impl.S3GkbService;
 import com.giantan.gfs.storer.util.FileUtil;
@@ -16,7 +19,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import org.apache.commons.io.IOUtils;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.FileAlreadyExistsException;
 import java.util.ArrayList;
@@ -36,6 +38,7 @@ public class MdDocsService implements IMdDocsService {
     public static final String FIELD_GID = "gid";
     public static final String FIELD_MDID = "id";
     public static final String FIELD_MDID2 = "mdId";
+    public static final String FIELD_CHUNKID = "chunkId";
     public static final String FIELD_ATTRIBUTES = "attributes";
     public static final String FIELD_MARK = "mark";
 
@@ -46,6 +49,8 @@ public class MdDocsService implements IMdDocsService {
 
 
     public static final String RESP_MATCH = "match";
+    public static final String RESP_TITLE = "title";
+    public static final String RESP_CONTENT = "content";
     public static final String RESP_HEADINGS = "headings";
 
     @Autowired
@@ -60,6 +65,9 @@ public class MdDocsService implements IMdDocsService {
     @Autowired
     MdDynamicChunkRepository mdDynamicChunkRepository;
 
+    @Autowired
+    IMdChunksService mdChunksService;
+
     //@Autowired
     //IHybridSearch hybridSearch;
 
@@ -305,6 +313,7 @@ public class MdDocsService implements IMdDocsService {
 
             MdSearcher searcher1 = new MdSearcher();
             searcher1.load(text, BaseParameters.defaultParams());
+            searcher1.setTitle(name);
             searcher = searcher1;
             mdCache.put(key, searcher);
         }
@@ -312,19 +321,19 @@ public class MdDocsService implements IMdDocsService {
     }
 
 
-    private MdSearcher getSearcher(String coll, String name) throws Exception {
-        String key = coll + ":" + name;
-        MdSearcher searcher = mdCache.get(key);
-        if (searcher == null) {
-            String text = getMdFileContent(coll, name);
-
-            MdSearcher searcher1 = new MdSearcher();
-            searcher1.load(text, BaseParameters.defaultParams());
-            searcher = searcher1;
-            mdCache.put(key, searcher);
-        }
-        return searcher;
-    }
+//    private MdSearcher getSearcher(String coll, String name) throws Exception {
+//        String key = coll + ":" + name;
+//        MdSearcher searcher = mdCache.get(key);
+//        if (searcher == null) {
+//            String text = getMdFileContent(coll, name);
+//
+//            MdSearcher searcher1 = new MdSearcher();
+//            searcher1.load(text, BaseParameters.defaultParams());
+//            searcher = searcher1;
+//            mdCache.put(key, searcher);
+//        }
+//        return searcher;
+//    }
 
     private String getKvObjectId(String collId, Map<String, Object> req) throws Throwable {
         //String collId = getStrOfCollId(coll);
@@ -333,11 +342,19 @@ public class MdDocsService implements IMdDocsService {
         Object o = req.get(FIELD_MDID);
 
         if (o != null) {
-            id = (String) o;
+            if (o instanceof String) {
+                id = (String) o;
+            }else {
+                id = o.toString();
+            }
         } else {
             o = req.get(FIELD_MDID2);
             if (o != null) {
-                id = (String) o;
+                if (o instanceof String) {
+                    id = (String) o;
+                }else {
+                    id = o.toString();
+                }
             } else {
                 o = req.get(FIELD_GID);
                 String gid = null;
@@ -585,9 +602,85 @@ public class MdDocsService implements IMdDocsService {
 
         Map<String, Object> ret = searcher.searchByHeadings(headings);
         ret.put(QUERY_HEADINGS, headings);
+        ret.put(FIELD_MDID2, mdid);
+        //ret.put(FIELD_CHUNKID, chunkId);
+        ret.put(RESP_TITLE, stripRoot(searcher.getTitle()));
+        return ret;
+    }
+
+    @Override
+    public Map<String, Object> getSectionByChunkId(String coll, Map<String, Object> req) throws Throwable {
+        Object o = req.get("chunkId");
+        if (o == null) {
+            return null;
+        }
+        Long chunkId = Long.valueOf(o.toString());
+
+        if (chunkId == null) {
+            return Map.of(RESP_MATCH, "", RESP_HEADINGS, List.of());
+        }
+        MdChunk chunk = mdChunksService.findById(coll, chunkId);
+        if (chunk == null) {
+            return Map.of(RESP_MATCH, "", RESP_HEADINGS, List.of());
+        }
+        Integer offsetStart = chunk.getOffsetStart();
+        //String mdid = getKvObjectId(collId, req);
+        String collId = getStrOfCollId(coll);
+        String mdid = Integer.toString(chunk.getMdId());
+        MdSearcher searcher = getSearcher2(coll, collId, mdid);
+        List<String> headings = searcher.getHeadingsByStartOffset(offsetStart);
+//        String sectionPath = chunk.getSectionPath();
+//        String[] headings = parseSectionPath(sectionPath);
+
+        if (headings == null || headings.size() == 0) {
+            //return Map.of(RESP_MATCH, "", RESP_HEADINGS, List.of());
+            return Map.of(RESP_MATCH, chunk.getPlainText(), RESP_HEADINGS, List.of());
+        }
+
+        Map<String, Object> req2 = new HashMap<>();
+        req2.put(FIELD_MDID2, mdid);
+        req2.put(QUERY_HEADINGS, headings);
+        Map<String, Object> ret = locateByHeading(coll, req2);
+        ret.put(FIELD_MDID2, mdid);
+        ret.put(FIELD_CHUNKID, chunkId);
+        ret.put(RESP_TITLE, stripRoot(searcher.getTitle()));
         return ret;
     }
 
+    private String stripRoot(String title) {
+        if (title == null) return null;
+        if (title.startsWith("/")) return title.substring(1);
+        return title;
+    }
+
+    private String[] parseSectionPath(String sectionPath) {
+        if (sectionPath == null) {
+            return null;
+        }
+        String trimmed = sectionPath.trim();
+        if (trimmed.isEmpty()) {
+            return null;
+        }
+        if ("/".equals(trimmed)) {
+            return new String[]{"/"};
+        }
+        String[] parts = trimmed.split(">");
+        List<String> headings = new ArrayList<>();
+        for (String part : parts) {
+            if (part == null) {
+                continue;
+            }
+            String s = part.trim();
+            while (s.startsWith("#")) {
+                s = s.substring(1).trim();
+            }
+            if (!s.isEmpty()) {
+                headings.add(s);
+            }
+        }
+        return headings.toArray(new String[0]);
+    }
+
 
     @Override
     //删除 md,同时删 chunk 和 index。

+ 1 - 1
server/src/main/java/com/giantan/data/mds/service/impl/MdFilesService.java

@@ -1,6 +1,6 @@
 package com.giantan.data.mds.service.impl;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.mds.service.IMdDocsService;
 import com.giantan.data.mds.service.IMdFilesService;
 import com.giantan.gfs.service.impl.S3GkbService;

+ 1 - 2
server/src/main/java/com/giantan/data/mds/service/impl/MdTaxonomyService.java

@@ -1,11 +1,10 @@
 package com.giantan.data.mds.service.impl;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.mds.repository.MdDynamicRepository;
 import com.giantan.data.mds.repository.MdDynamicTaxonomyRepository;
 import com.giantan.data.mds.service.IMdDocsService;
 import com.giantan.data.taxonomy.model.TaxonomyNode;
-import com.giantan.data.taxonomy.repository.DynamicTaxonomyRepository;
 import com.giantan.gfs.service.impl.S3GkbService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;

+ 2 - 2
server/src/main/java/com/giantan/data/mds/task/MdPersistentTaskService.java

@@ -3,9 +3,9 @@ package com.giantan.data.mds.task;
 import com.giantan.data.mds.repository.MdDynamicTaskRepository;
 import com.giantan.data.mds.service.impl.MdCollectionsService;
 import com.giantan.data.tasks.IPersistentTaskService;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.repository.TaskConverter;
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 
 
 import java.time.LocalDateTime;

+ 1 - 0
server/src/main/java/com/giantan/data/mds/task/impl/BaseTaskHandler.java

@@ -1,6 +1,7 @@
 package com.giantan.data.mds.task.impl;
 
 import com.giantan.data.tasks.*;
+import com.giantan.data.tasks.model.TaskContext;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
server/src/main/java/com/giantan/data/mds/task/impl/ChunksTaskHandler.java

@@ -9,7 +9,7 @@ import com.giantan.data.mds.service.IMdChunksService;
 import com.giantan.data.index.IVectorization;
 import com.giantan.data.index.dto.DocReq;
 import com.giantan.data.index.dto.DocResp;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.TaskType;
 
 import java.io.IOException;

+ 2 - 2
server/src/main/java/com/giantan/data/mds/task/impl/MdsTaskHandler.java

@@ -1,11 +1,11 @@
 package com.giantan.data.mds.task.impl;
 
 import com.giantan.ai.util.JsonUtils;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.mds.chunk.MdChunk;
 import com.giantan.data.mds.service.IMdChunksService;
 import com.giantan.data.mds.service.IMdFilesService;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.TaskType;
 import org.cnnlp.data.document.GDocConstants;
 import org.cnnlp.data.document.GDocument;

+ 166 - 0
server/src/main/java/com/giantan/data/mds/util/NlpTools.java

@@ -0,0 +1,166 @@
+package com.giantan.data.mds.util;
+
+import cnnlp.lexical.dict.POSUtil;
+import cnnlp.lexical.segment.WordAtoms;
+import org.cnnlp.lexical.segment.ConcurrentSegmentWorker;
+import org.cnnlp.service.BaseCore;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class NlpTools {
+
+    public static boolean isSenPunctuation(String punc) {
+        if (",,。.;;??!!".indexOf(punc) >= 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public static WordAtoms segment(String text) {
+        ConcurrentSegmentWorker instance = BaseCore.getInstance().getMinSegment2();
+        WordAtoms ws = instance.segment(text);
+        ws.trim();
+        return ws;
+    }
+
+    public static List<Sentence> splitSentences(String text) {
+        WordAtoms ws = segment(text);
+        List<Sentence> ss = new ArrayList<>();
+        int start = 0;
+        int end = 0;
+        List<String> words = new ArrayList<>();
+        for (int i = 0; i < ws.trimLength(); i++) {
+           if ( ws.getTags(i) == POSUtil.POS_W && isSenPunctuation(ws.getWords(i))){
+               words.add(ws.getWords(i));
+               start = i+1;
+               end = start;
+               Sentence s1 = Sentence.builder().words(words).build();
+               ss.add(s1);
+               words = new ArrayList<>();
+           }else{
+               words.add(ws.getWords(i));
+           }
+        }
+        if (words.size() > 0) {
+            ss.add(Sentence.builder().words(words).build());
+        }
+        return ss;
+    }
+
+    //关键词数量	越多越好
+    //关键词密度	越集中越好
+    public static double scoreSentence(Sentence sentence, Set<String> queryTerms){
+        int match = 0;
+        List<String> tokens = sentence.getWords();
+        if (tokens.size() == 0) { return 0; }
+
+        for (String t : tokens) {
+            if (queryTerms.contains(t)) {
+                match++;
+            }
+        }
+        double density = (double) match / (tokens.size()+1);
+        return match * 2 + density;
+    }
+
+    public static String generateSnippet(String text, String query) {
+        return generateSnippet(text, query, 160);
+    }
+
+    public static String generateSnippet(String text, String query, int maxLength) {
+        if (text == null || text.isEmpty()) { return ""; }
+        if (query == null) { query = ""; }
+        if (maxLength <= 0) { return ""; }
+
+        // 1) 分词(query)
+        WordAtoms qws = segment(query);
+        Set<String> queryTerms = new HashSet<>();
+        for (int i = 0; i < qws.trimLength(); i++) {
+            String w = qws.getWords(i);
+            if (w == null || w.isEmpty()) { continue; }
+            if (qws.getTags(i) == POSUtil.POS_W && isSenPunctuation(w)) { continue; }
+            queryTerms.add(w);
+        }
+
+        // 2) 分句(text)
+        List<Sentence> sentences = splitSentences(text);
+        if (sentences.isEmpty()) {
+            return text.length() <= maxLength ? text : text.substring(0, maxLength);
+        }
+
+        // 3) 评分
+        double bestScore = -1;
+        int bestIdx = 0;
+        double[] scores = new double[sentences.size()];
+        for (int i = 0; i < sentences.size(); i++) {
+            double s = scoreSentence(sentences.get(i), queryTerms);
+            scores[i] = s;
+            if (s > bestScore) {
+                bestScore = s;
+                bestIdx = i;
+            }
+        }
+
+        // 4) 扩展上下文(优先选择相邻高分句)
+        int start = bestIdx;
+        int end = bestIdx;
+        while (true) {
+            String current = joinSentences(sentences, start, end);
+            if (current.length() >= maxLength) { break; }
+            int left = start - 1;
+            int right = end + 1;
+            boolean canLeft = left >= 0;
+            boolean canRight = right < sentences.size();
+            if (!canLeft && !canRight) { break; }
+
+            if (canLeft && canRight) {
+                if (scores[left] >= scores[right]) {
+                    start = left;
+                } else {
+                    end = right;
+                }
+            } else if (canLeft) {
+                start = left;
+            } else {
+                end = right;
+            }
+        }
+
+        boolean needPrefix = start > 0;
+        boolean needSuffix = end < sentences.size() - 1;
+        int room = maxLength;
+        if (room <= 0) { return ""; }
+        if (needPrefix) { room = Math.max(0, room - 3); }
+        if (needSuffix) { room = Math.max(0, room - 3); }
+
+        String core = joinSentences(sentences, start, end);
+        if (core.length() > room) {
+            if (room <= 0) {
+                core = "";
+            } else if (bestIdx == end) {
+                // best 句在末尾:截取尾部
+                core = core.substring(Math.max(0, core.length() - room));
+            } else {
+                core = core.substring(0, room);
+            }
+        }
+        String snippet = (needPrefix ? "..." : "") + core + (needSuffix ? "..." : "");
+        return snippet;
+    }
+
+    private static String joinSentences(List<Sentence> sentences, int start, int end) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = start; i <= end; i++) {
+            List<String> words = sentences.get(i).getWords();
+            if (words == null) { continue; }
+            for (String w : words) {
+                if (w != null) { sb.append(w); }
+            }
+        }
+        return sb.toString();
+    }
+}

+ 25 - 0
server/src/main/java/com/giantan/data/mds/util/Sentence.java

@@ -0,0 +1,25 @@
+package com.giantan.data.mds.util;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class Sentence {
+    List<String> words;
+    public Sentence() {
+    }
+
+    public Sentence(List<String> words) {
+        this.words = words;
+    }
+
+    @Override
+    public String toString() {
+        return "Sentence{" +
+                "words=" + words +
+                '}';
+    }
+}

+ 1 - 1
server/src/main/java/com/giantan/data/qa/backup/v2/V2CollsSearchController.java

@@ -1,7 +1,7 @@
 package com.giantan.data.qa.backup.v2;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.common.model.CollsSearchRequest;
 import com.giantan.data.qa.service.QaCollsSearchService;

+ 1 - 1
server/src/main/java/com/giantan/data/qa/backup/v2/V2DocsController.java

@@ -1,7 +1,7 @@
 package com.giantan.data.qa.backup.v2;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.qa.service.QaDocsService;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 2
server/src/main/java/com/giantan/data/qa/backup/v2/V2TaskController.java

@@ -3,9 +3,9 @@ package com.giantan.data.qa.backup.v2;
 import com.giantan.ai.common.reponse.R;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.qa.service.task.QaTaskManager;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.TaskType;
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;

+ 1 - 1
server/src/main/java/com/giantan/data/qa/backup/v2/V2TaxonomyController.java

@@ -1,7 +1,7 @@
 package com.giantan.data.qa.backup.v2;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.qa.service.QaTaxonomyService;
 import com.giantan.data.taxonomy.model.TaxonomyNode;

+ 79 - 0
server/src/main/java/com/giantan/data/qa/controller/CollectionController.java

@@ -0,0 +1,79 @@
+package com.giantan.data.qa.controller;
+
+
+import com.giantan.ai.common.reponse.R;
+import com.giantan.data.common.model.GBaseKeyValue;
+import com.giantan.data.qa.constant.QaConstants;
+import com.giantan.data.qa.service.QaCollectionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+//修改某个字段,推荐 PATCH。
+//整体替换,才用 PUT。
+//新增才用 POST。
+
+@RestController("qaCollectionContoller")
+@RequestMapping(QaConstants.API_PREFIX + "/collections")
+@CrossOrigin(origins = "*", maxAge = 3600)
+public class CollectionController {
+
+    @Autowired
+    QaCollectionService qaCollectionService;
+
+    @PostMapping
+    public R<GBaseKeyValue> createCollection(@RequestParam String name) throws Throwable {
+        return R.data(qaCollectionService.createCollection(name));
+    }
+
+    @GetMapping
+    public R<List<GBaseKeyValue>> getAllCollections() throws Throwable {
+        return R.data(qaCollectionService.getAllCollections());
+    }
+
+    @GetMapping("/{name}")
+    public R<GBaseKeyValue> getCollectionById(@PathVariable String name) throws Throwable {
+        return R.data(qaCollectionService.getKvByName(name));
+    }
+
+    @DeleteMapping("/{name}")
+    public R<Long> deleteCollection(@PathVariable String name) throws Throwable {
+        // long ret = collectionService.deleteCollection(id);
+        long ret = qaCollectionService.deleteCollection(name);
+        return R.data(ret);
+    }
+
+    @DeleteMapping("/{name}/all")
+    public R<Long> clearCollection(@PathVariable String name) throws Throwable {
+        // long ret = collectionService.deleteCollection(id);
+        long ret = qaCollectionService.clearCollection(name);
+        return R.data(ret);
+    }
+
+    @PutMapping("/{name}")
+    public R<GBaseKeyValue> update(@PathVariable String name, @RequestBody Map<String, Object> kvs) throws Throwable {
+        return R.data(qaCollectionService.updateCollection(name, kvs));
+    }
+
+    @GetMapping("/{name}/attributes")
+    public R<Map<String, Object>> getAttributes(@PathVariable String name) throws Throwable {
+        return R.data(qaCollectionService.getCollectionAttributes(name));
+    }
+
+    @PutMapping("/{name}/attributes")
+    public R<Map<String, Object>> updateAttributes(@PathVariable String name, @RequestBody Map<String, Object> attributes) throws Throwable {
+        return R.data(qaCollectionService.updateCollectionAttributes(name, attributes));
+    }
+
+    @DeleteMapping("/{name}/attributes")
+    public R<Map<String, Object>> removeAttribute(@PathVariable String name, @RequestParam List<String> keys) throws Throwable {
+        return R.data(qaCollectionService.removeCollectionAttribute(name, keys));
+    }
+
+//    @PutMapping("/{name}/attributes")
+//    public ResponseEntity<R> updateChunkMode(@PathVariable String name, @RequestBody Map<String,Object> attributes) throws Throwable {
+//        return ResponseEntity.ok(R.data(qaCollectionService.updateChunkMode(name,attributes)));
+//    }
+}

+ 5 - 5
server/src/main/java/com/giantan/data/qa/controller/QaCollsSearchController.java → server/src/main/java/com/giantan/data/qa/controller/CollsSearchController.java

@@ -1,7 +1,7 @@
 package com.giantan.data.qa.controller;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.common.model.CollsSearchRequest;
 import com.giantan.data.qa.service.QaCollsSearchService;
@@ -11,17 +11,17 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-@RestController
+@RestController("qaCollsSearchController")
 @RequestMapping(QaConstants.API_PREFIX + "/collections/_search")
-public class QaCollsSearchController {
+public class CollsSearchController {
 
     @Autowired
     QaCollsSearchService qaSearchService;
 
     @PostMapping()
-    public ResponseEntity<R> federatedSearch(@RequestBody CollsSearchRequest query) throws Throwable {
+    public R<List<GBaseKeyValue>> federatedSearch(@RequestBody CollsSearchRequest query) throws Throwable {
         List<GBaseKeyValue> rets = qaSearchService.federatedSearch(query);
-        return ResponseEntity.ok(R.data(rets));
+        return R.data(rets);
     }
 
 

+ 2 - 2
server/src/main/java/com/giantan/data/qa/controller/QaProxySearchContoller.java → server/src/main/java/com/giantan/data/qa/controller/ProxySearchContoller.java

@@ -15,9 +15,9 @@ import org.springframework.web.client.RestTemplate;
 import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 
-@RestController
+@RestController("qaProxySearchContoller")
 @RequestMapping(QaConstants.API_PREFIX + "/collections/{coll}")
-public class QaProxySearchContoller {
+public class ProxySearchContoller {
     private static final org.slf4j.Logger log
             = org.slf4j.LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 

+ 0 - 79
server/src/main/java/com/giantan/data/qa/controller/QaCollectionsController.java

@@ -1,79 +0,0 @@
-package com.giantan.data.qa.controller;
-
-
-import com.giantan.ai.common.reponse.R;
-import com.giantan.data.qa.constant.QaConstants;
-import com.giantan.data.qa.service.QaCollectionService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-//修改某个字段,推荐 PATCH。
-//整体替换,才用 PUT。
-//新增才用 POST。
-
-@RestController
-@RequestMapping(QaConstants.API_PREFIX+"/collections")
-@CrossOrigin(origins = "*", maxAge = 3600)
-public class QaCollectionsController {
-
-    @Autowired
-    QaCollectionService qaCollectionService;
-
-    @PostMapping
-    public ResponseEntity<R> createCollection(@RequestParam String name) throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.createCollection(name)));
-    }
-
-    @GetMapping
-    public ResponseEntity<R> getAllCollections() throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.getAllCollections()));
-    }
-
-    @GetMapping("/{name}")
-    public ResponseEntity<R> getCollectionById(@PathVariable String name) throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.getKvByName(name)));
-    }
-
-    @DeleteMapping("/{name}")
-    public ResponseEntity<R> deleteCollection(@PathVariable String name) throws Throwable {
-       // long ret = collectionService.deleteCollection(id);
-        long ret = qaCollectionService.deleteCollection(name);
-        return ResponseEntity.ok(R.data(ret));
-    }
-
-    @DeleteMapping("/{name}/all")
-    public ResponseEntity<R> clearCollection(@PathVariable String name) throws Throwable {
-        // long ret = collectionService.deleteCollection(id);
-        long ret = qaCollectionService.clearCollection(name);
-        return ResponseEntity.ok(R.data(ret));
-    }
-
-    @PutMapping("/{name}")
-    public ResponseEntity<R> update(@PathVariable String name,  @RequestBody Map<String,Object> kvs) throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.updateCollection(name,kvs)));
-    }
-
-    @GetMapping("/{name}/attributes")
-    public ResponseEntity<R> getAttributes(@PathVariable String name) throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.getCollectionAttributes(name)));
-    }
-
-    @PutMapping("/{name}/attributes")
-    public ResponseEntity<R> updateAttributes(@PathVariable String name,  @RequestBody Map<String,Object> attributes) throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.updateCollectionAttributes(name,attributes)));
-    }
-
-    @DeleteMapping("/{name}/attributes")
-    public ResponseEntity<R> removeAttribute(@PathVariable String name,@RequestBody List<String> keys) throws Throwable {
-        return ResponseEntity.ok(R.data(qaCollectionService.removeCollectionAttribute(name,keys)));
-    }
-
-//    @PutMapping("/{name}/attributes")
-//    public ResponseEntity<R> updateChunkMode(@PathVariable String name, @RequestBody Map<String,Object> attributes) throws Throwable {
-//        return ResponseEntity.ok(R.data(qaCollectionService.updateChunkMode(name,attributes)));
-//    }
-}

+ 46 - 47
server/src/main/java/com/giantan/data/qa/controller/QaDocsController.java → server/src/main/java/com/giantan/data/qa/controller/QaController.java

@@ -1,11 +1,10 @@
 package com.giantan.data.qa.controller;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.qa.service.QaDocsService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
@@ -44,7 +43,7 @@ import java.util.Map;
 
 @RestController
 @RequestMapping(QaConstants.API_PREFIX + "/collections/{collId}")
-public class QaDocsController {
+public class QaController {
     private static final org.slf4j.Logger log
             = org.slf4j.LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -52,26 +51,26 @@ public class QaDocsController {
     QaDocsService qaDocsService;
 
     @PostMapping("/docs")
-    public R createEntry(@PathVariable String collId, @RequestBody Map<String, Object> data) throws Throwable {
+    public R<GBaseKeyValue> createEntry(@PathVariable String collId, @RequestBody Map<String, Object> data) throws Throwable {
         GBaseKeyValue r = qaDocsService.save(collId, GBaseKeyValue.build(data));
         return R.data(r);
     }
 
     @PostMapping("/docs/batch")
-    public R createBatch(@PathVariable String collId, @RequestBody List<GBaseKeyValue> kvs) throws Throwable {
+    public R<List<Integer>> createBatch(@PathVariable String collId, @RequestBody List<GBaseKeyValue> kvs) throws Throwable {
         List<Integer> ret = qaDocsService.saveAll(collId, kvs);
         return R.data(ret);
     }
 
     @GetMapping("/docs/{id}")
-    public R<?> getById(@PathVariable String collId, @PathVariable String id
+    public R<GBaseKeyValue> getById(@PathVariable String collId, @PathVariable String id
     ) throws Throwable {
         GBaseKeyValue ret = qaDocsService.findByIdOrGid(collId, id);
         return R.data(ret);
     }
 
     @DeleteMapping("/docs/{gid}")
-    public R<?> delete(@PathVariable String collId, @PathVariable String gid
+    public R<Map<String, Object>> delete(@PathVariable String collId, @PathVariable String gid
     ) throws Throwable {
         //String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
@@ -101,7 +100,7 @@ public class QaDocsController {
     }
 
     @PutMapping("/docs")
-    public R update(@PathVariable String collId, @RequestBody GBaseKeyValue kv) throws Throwable {
+    public R<GBaseKeyValue> update(@PathVariable String collId, @RequestBody GBaseKeyValue kv) throws Throwable {
         GBaseKeyValue updatedKv = qaDocsService.update(collId, kv);
         return R.data(updatedKv);
     }
@@ -170,7 +169,7 @@ public class QaDocsController {
 
 
     @PostMapping("/docs/{docId}/rename")
-    public R<?> rename(@PathVariable String collId, @PathVariable String docId, @RequestBody Map<String, Object> req
+    public R<Map<String, Object>> rename(@PathVariable String collId, @PathVariable String docId, @RequestBody Map<String, Object> req
     ) throws Throwable {
         Map<String, Object> r = qaDocsService.rename(collId, docId, req);
         return R.data(r);
@@ -181,31 +180,31 @@ public class QaDocsController {
     // 更新属性
 
     @GetMapping("/docs/{docId}/attributes")
-    public R getAttributeByKey(@PathVariable String collId, @PathVariable String docId
+    public R<Object> getAttributeByKey(@PathVariable String collId, @PathVariable String docId
     ) throws Throwable {
         Object ret = qaDocsService.getAttributes(collId, docId);
         return R.data(ret);
     }
 
     @GetMapping("/docs/{docId}/attributes/{key}")
-    public R getAttributeByKey(@PathVariable String collId, @PathVariable String docId,
-                               @PathVariable String key
+    public R<Object> getAttributeByKey(@PathVariable String collId, @PathVariable String docId,
+                                       @PathVariable String key
     ) throws Throwable {
         Object ret = qaDocsService.getAttributeByKey(collId, docId, key);
         return R.data(ret);
     }
 
     @PatchMapping("/docs/{docId}/attributes")
-    public R patchAttributes(@PathVariable String collId, @PathVariable String docId,
-                             @RequestBody GBaseKeyValue data
+    public R<Object> patchAttributes(@PathVariable String collId, @PathVariable String docId,
+                                     @RequestBody GBaseKeyValue data
     ) throws Throwable {
         Object ret = qaDocsService.patchAttributes(collId, docId, data);
         return R.data(ret);
     }
 
     @DeleteMapping("/docs/{docId}/attributes/{key}")
-    public R deleteAttributeByKey(@PathVariable String collId, @PathVariable String docId,
-                                  @PathVariable String key
+    public R<Object> deleteAttributeByKey(@PathVariable String collId, @PathVariable String docId,
+                                          @PathVariable String key
     ) throws Throwable {
         Object ret = qaDocsService.deleteAttributeByKey(collId, docId, key);
         return R.data(ret);
@@ -213,20 +212,20 @@ public class QaDocsController {
 
     // 移除属性
     @DeleteMapping("/docs/{docId}/attributes")
-    public R removeAttribute(@PathVariable String collId, @PathVariable String docId, @RequestBody List<String> keys) throws Throwable {
+    public R<GBaseKeyValue> removeAttribute(@PathVariable String collId, @PathVariable String docId, @RequestParam List<String> keys) throws Throwable {
         GBaseKeyValue updatedKv = qaDocsService.deleteAttributeByKeys(collId, docId, keys);
         return R.data(updatedKv);
     }
 
     @PutMapping("/docs/{docId}/attributes")
-    public R updateAttribute(@PathVariable String collId, @PathVariable Integer docId, @RequestBody Map<String, Object> attributes) throws Throwable {
+    public R<GBaseKeyValue> updateAttribute(@PathVariable String collId, @PathVariable Integer docId, @RequestBody Map<String, Object> attributes) throws Throwable {
         GBaseKeyValue updatedKv = qaDocsService.updateAttribute(collId, docId, attributes);
         return R.data(updatedKv);
     }
 
     // 获取某些字段的所有值
     @PostMapping("/docs/fields")
-    public R getAllEntities(@PathVariable String collId, @RequestBody List<String> fields) throws Throwable {
+    public R<List<Map<String, Object>>> getAllEntities(@PathVariable String collId, @RequestBody List<String> fields) throws Throwable {
         List<Map<String, Object>> entities = qaDocsService.getAllEntities(collId, fields);
         return R.data(entities);
     }
@@ -245,87 +244,87 @@ public class QaDocsController {
     //GET /collections/demo/paths/descendants?path=/a
 
     @GetMapping("/docs/by-path")
-    public R getDocsBypPath(@PathVariable String collId, @RequestParam String path) throws Throwable {
+    public R<List<GBaseKeyValue>> getDocsBypPath(@PathVariable String collId, @RequestParam String path) throws Throwable {
         List<GBaseKeyValue> rets = qaDocsService.findByPath(collId, path);
         return R.data(rets);
     }
 
     @GetMapping("/docs/by-prefix")
-    public R getDocsBypPrefix(@PathVariable String collId, @RequestParam String prefix) throws Throwable {
+    public R<List<GBaseKeyValue>> getDocsBypPrefix(@PathVariable String collId, @RequestParam String prefix) throws Throwable {
         List<GBaseKeyValue> rets = qaDocsService.findByPrefix(collId, prefix);
         return R.data(rets);
     }
 
     @DeleteMapping("/docs/by-path")
-    public R deletePathAndDescendants(@PathVariable String collId, @RequestParam String path) throws Throwable {
+    public R<Integer> deletePathAndDescendants(@PathVariable String collId, @RequestParam String path) throws Throwable {
         int rets = qaDocsService.deletePathAndDescendants(collId, path);
         return R.data(rets);
     }
 
     // 获取记录数
     @GetMapping("/docs/count")
-    public R getCount(@PathVariable String collId) {
+    public R<Long> getCount(@PathVariable String collId) {
         long count = qaDocsService.count(collId);
         return R.data(count);
     }
 
     @PostMapping("/docs/{docId}/tags/add")
-    public ResponseEntity<R> appendTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
+    public R<List<String>> appendTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
         List<String> ret = qaDocsService.appendArrayField(collId, docId, "tags", values);
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @PostMapping("/docs/{docId}/tags/set")
-    public ResponseEntity<R> setTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
+    public R<List<String>> setTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
         List<String> ret = qaDocsService.setArrayField(collId, docId, "tags", values);
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @PostMapping("/docs/{docId}/tags/remove")
-    public ResponseEntity<R> removeTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
+    public R<List<String>> removeTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
         List<String> ret = qaDocsService.removeArrayField(collId, docId, "tags", values);
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @PostMapping("/docs/{docId}/altlabels/add")
-    public ResponseEntity<R> appendAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
+    public R<List<String>> appendAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
         List<String> ret = qaDocsService.appendArrayField(collId, docId, "altlabels", values);
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @PostMapping("/docs/{docId}/altlabels/set")
-    public ResponseEntity<R> setAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
+    public R<List<String>> setAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
         List<String> ret = qaDocsService.setArrayField(collId, docId, "altlabels", values);
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @PostMapping("/docs/{docId}/altlabels/remove")
-    public ResponseEntity<R> removeAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
+    public R<List<String>> removeAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
         List<String> ret = qaDocsService.removeArrayField(collId, docId, "altlabels", values);
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @PostMapping("/docs/fulltextSearch")
-    public ResponseEntity<R> fulltextSearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
+    public R<List<GBaseKeyValue>> fulltextSearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
         List<GBaseKeyValue> rets = qaDocsService.fulltextSearch(collId, query);
-        return ResponseEntity.ok(R.data(rets));
+        return R.data(rets);
     }
 
     @PostMapping("/docs/similaritySearch")
-    public ResponseEntity<R> similaritySearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
+    public R<List<GBaseKeyValue>> similaritySearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
         List<GBaseKeyValue> rets = qaDocsService.similaritySearch(collId, query);
-        return ResponseEntity.ok(R.data(rets));
+        return R.data(rets);
     }
 
     @PostMapping("/docs/hybridSearch")
-    public ResponseEntity<R> hybridSearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
+    public R<List<GBaseKeyValue>> hybridSearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
         List<GBaseKeyValue> rets = qaDocsService.hybridSearch(collId, query);
-        return ResponseEntity.ok(R.data(rets));
+        return R.data(rets);
     }
 
     //////////////
     @GetMapping("/docs")
-    public ResponseEntity<R> getDocs(
+    public R<List<GBaseKeyValue>> getDocs(
             @PathVariable String collId,
             @RequestParam(required = false) String path,
             @RequestParam(required = false) String prefix,
@@ -340,11 +339,11 @@ public class QaDocsController {
         } else {
             rets = qaDocsService.findAll(collId);
         }
-        return ResponseEntity.ok(R.data(rets));
+        return R.data(rets);
     }
 
     @DeleteMapping("/docs")
-    public ResponseEntity<R> deleteDocs(
+    public R<Integer> deleteDocs(
             @PathVariable String collId,
             @RequestParam(required = false) String path,
             @RequestParam(required = false) String prefix,
@@ -359,12 +358,12 @@ public class QaDocsController {
         } else {
             throw new IllegalArgumentException("Must provide path or prefix to delete");
         }
-        return ResponseEntity.ok(R.data(ret));
+        return R.data(ret);
     }
 
     @DeleteMapping("/docs/indexes")
-    public ResponseEntity<R> deleteDocsIndexes(@PathVariable String collId) throws IOException, InterruptedException {
+    public R<Integer> deleteDocsIndexes(@PathVariable String collId) throws IOException, InterruptedException {
         int r = qaDocsService.deleteAllIndex(collId);
-        return ResponseEntity.ok(R.data(r));
+        return R.data(r);
     }
 }

+ 9 - 9
server/src/main/java/com/giantan/data/qa/controller/QaTaskController.java → server/src/main/java/com/giantan/data/qa/controller/TaskController.java

@@ -3,18 +3,18 @@ package com.giantan.data.qa.controller;
 import com.giantan.ai.common.reponse.R;
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.qa.service.task.QaTaskManager;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.TaskType;
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
 import java.util.*;
 
-@RestController
+@RestController("qaTaskContoller")
 @RequestMapping(QaConstants.API_PREFIX + "/collections/{collId}/tasks")
-public class QaTaskController {
+public class TaskController {
 
     @Autowired
     private QaTaskManager manager;
@@ -33,7 +33,7 @@ public class QaTaskController {
      */
 
     @PostMapping("/submit")
-    public R<Map> submit(@PathVariable String collId, @RequestBody Map<String, Object> payload) {
+    public R<Map<String, Object>> submit(@PathVariable String collId, @RequestBody Map<String, Object> payload) {
         String t = (String) payload.remove("type");
 
         TaskType type = TaskType.valueOf(t);
@@ -61,13 +61,13 @@ public class QaTaskController {
     }
 
     @PostMapping("/{id}/cancel")
-    public R<Map> cancel(@PathVariable String collId, @PathVariable String id) {
+    public R<Map<String, Object>> cancel(@PathVariable String collId, @PathVariable String id) {
         boolean ok = manager.cancel(collId, id);
         return R.data(Map.of("canceled", ok));
     }
 
     @DeleteMapping("/{id}")
-    public R<Map> delete(@PathVariable String collId, @PathVariable String id) {
+    public R<Map<String, Object>> delete(@PathVariable String collId, @PathVariable String id) {
         boolean ok = manager.delete(collId, id);
         return R.data(Map.of("deleted", ok));
     }
@@ -86,7 +86,7 @@ public class QaTaskController {
     }
 
     @DeleteMapping("/cleanup")
-    public R<Map> cleanup(@PathVariable String collId) {
+    public R<Map<String, Object>> cleanup(@PathVariable String collId) {
         int r = manager.cleanupNow(collId);
         //return ResponseEntity.ok("Task cleanup triggered.");
         return R.data(Map.of("deleted", r));
@@ -127,7 +127,7 @@ public class QaTaskController {
     }
 
     @DeleteMapping("/history/cleanup")
-    public R deleteHistory(@PathVariable String collId,
+    public R<Integer> deleteHistory(@PathVariable String collId,
                            @RequestParam(value = "createdAtStart", required = false) String createdAtStart,
                            @RequestParam(value = "createdAtEnd", required = false) String createdAtEnd,
                            @RequestParam(value = "status", required = false) String status

+ 20 - 28
server/src/main/java/com/giantan/data/qa/controller/QaTaxonomyController.java → server/src/main/java/com/giantan/data/qa/controller/TaxonomyController.java

@@ -1,7 +1,7 @@
 package com.giantan.data.qa.controller;
 
 import com.giantan.ai.common.reponse.R;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import com.giantan.data.qa.constant.QaConstants;
 import com.giantan.data.qa.service.QaTaxonomyService;
@@ -14,9 +14,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-@RestController
+@RestController("qaTaxonomyController")
 @RequestMapping(QaConstants.API_PREFIX + "/collections/{collName}")
-public class QaTaxonomyController {
+public class TaxonomyController {
     private static final org.slf4j.Logger log
             = org.slf4j.LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -28,7 +28,7 @@ public class QaTaxonomyController {
 //        List<TaxonomyNode> r = dynamicTaxonomyService.listAll(collName);
 //        return ResponseEntity.ok(r);
 //    }
-    public R listAll(@PathVariable String collName) {
+    public R<List<TaxonomyNode>> listAll(@PathVariable String collName) {
         List<TaxonomyNode> r = dynamicTaxonomyService.listAll(collName);
         return R.data(r);
     }
@@ -39,7 +39,7 @@ public class QaTaxonomyController {
 //        List<TaxonomyNode> r = dynamicTaxonomyService.listTree(collName);
 //        return ResponseEntity.ok(r);
 //    }
-    public R listTree(@PathVariable String collName) {
+    public R<List<TaxonomyNode>> listTree(@PathVariable String collName) {
         List<TaxonomyNode> r = dynamicTaxonomyService.listTree(collName);
         return R.data(r);
     }
@@ -50,29 +50,21 @@ public class QaTaxonomyController {
 //        List<TaxonomyNode> r = dynamicTaxonomyService.findChildren(collName, nodeId);
 //        return ResponseEntity.ok(r);
 //    }
-    public R findChildren(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<List<TaxonomyNode>> findChildren(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
         List<TaxonomyNode> r = dynamicTaxonomyService.findChildren(collName, nodeId);
         return R.data(r);
     }
 
 
     @GetMapping("/taxonomy/{nodeId}/docs")
-//    public ResponseEntity<?> findMds(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
-//        List<GBaseKeyValue> r = dynamicTaxonomyService.findMds(collName, nodeId);
-//        return ResponseEntity.ok(r);
-//    }
-    public R findMds(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<List<GBaseKeyValue>> findMds(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
         List<GBaseKeyValue> r = dynamicTaxonomyService.findMds(collName, nodeId);
         return R.data(r);
     }
 
 
     @PostMapping("/taxonomy")
-//    public ResponseEntity<?> createNode(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
-//        TaxonomyNode r = dynamicTaxonomyService.createNode(collName, data);
-//        return ResponseEntity.ok(r);
-//    }
-    public R createNode(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
+    public R<TaxonomyNode> createNode(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
         TaxonomyNode r = dynamicTaxonomyService.createNode(collName, data);
         return R.data(r);
     }
@@ -96,7 +88,7 @@ public class QaTaxonomyController {
 //    }
 
     @DeleteMapping("/taxonomy/{nodeId}/docs")
-    public R deleteFolder(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<Integer> deleteFolder(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
         String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
         //System.out.println("file = " + file.getOriginalFilename());
@@ -109,7 +101,7 @@ public class QaTaxonomyController {
     }
 
     @PostMapping("/taxonomy/{nodeId}/rename")
-    public R renameFolder(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
+    public R<Integer> renameFolder(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
         String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
         //System.out.println("file = " + file.getOriginalFilename());
@@ -122,7 +114,7 @@ public class QaTaxonomyController {
     }
 
     @PostMapping("/taxonomy/{nodeId}/move")
-    public R moveTo(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
+    public R<Integer> moveTo(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> req) throws Exception {
         String taskId = UUID.randomUUID().toString();
         //System.out.println("taskId = " + taskId);
         //System.out.println("file = " + file.getOriginalFilename());
@@ -135,25 +127,25 @@ public class QaTaxonomyController {
     }
 
     @GetMapping("/taxonomy/{nodeId}/subtree")
-    public R getSubtree(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<List<TaxonomyNode>> getSubtree(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
         List<TaxonomyNode> r = dynamicTaxonomyService.findSubtree(collName, nodeId);
         return R.data(r);
     }
 
     @GetMapping("/taxonomy/{nodeId}/descendants")
-    public R getDescendants(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<List<TaxonomyNode>> getDescendants(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
         List<TaxonomyNode> r = dynamicTaxonomyService.findDescendants(collName, nodeId);
         return R.data(r);
     }
 
     @GetMapping("/taxonomy/{nodeId}/ancestors")
-    public R getAncestors(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
+    public R<List<TaxonomyNode>> getAncestors(@PathVariable String collName, @PathVariable String nodeId) throws Exception {
         List<TaxonomyNode> r = dynamicTaxonomyService.findAncestors(collName, nodeId);
         return R.data(r);
     }
 
     @PostMapping("/taxonomy/{nodeId}/docs/by-path")
-    public R createDocByPath(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> data) throws Throwable {
+    public R<GBaseKeyValue> createDocByPath(@PathVariable String collName, @PathVariable String nodeId, @RequestBody Map<String, Object> data) throws Throwable {
         GBaseKeyValue ret = dynamicTaxonomyService.createQa(collName, nodeId, GBaseKeyValue.build(data));
         return R.data(ret);
     }
@@ -161,31 +153,31 @@ public class QaTaxonomyController {
     ////////////
 
     @PostMapping("/docs/by-path")
-    public R createEntityByPath(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Throwable {
+    public R<GBaseKeyValue> createEntityByPath(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Throwable {
         GBaseKeyValue ret = dynamicTaxonomyService.createEntityByPath(collName, GBaseKeyValue.build(data));
         return R.data(ret);
     }
 
     @PostMapping("/taxonomy/by-path")
-    public R createNodeByPath(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
+    public R<TaxonomyNode> createNodeByPath(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
         TaxonomyNode r = dynamicTaxonomyService.createNodeByPath(collName, data);
         return R.data(r);
     }
 
     @PutMapping("/taxonomy/by-path")
-    public R updateNodeByPath(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
+    public R<TaxonomyNode> updateNodeByPath(@PathVariable String collName, @RequestBody Map<String, Object> data) throws Exception {
         TaxonomyNode r = dynamicTaxonomyService.updateNodeByPath(collName, data);
         return R.data(r);
     }
 
     @GetMapping("/taxonomy/by-path")
-    public R findNodeByPath(@PathVariable String collName, @RequestParam String path) throws Exception {
+    public R<TaxonomyNode> findNodeByPath(@PathVariable String collName, @RequestParam String path) throws Exception {
         TaxonomyNode r = dynamicTaxonomyService.findNodeByPath(collName, path);
         return R.data(r);
     }
 
     @DeleteMapping("/taxonomy/by-path")
-    public R deleteFolderByPath(@PathVariable String collName, @RequestParam String path) throws Exception {
+    public R<Integer> deleteFolderByPath(@PathVariable String collName, @RequestParam String path) throws Exception {
         int ret = dynamicTaxonomyService.deleteFolderByPath(collName, path);
         return R.data(ret);
     }

+ 1 - 1
server/src/main/java/com/giantan/data/qa/service/IQaDocsService.java

@@ -1,6 +1,6 @@
 package com.giantan.data.qa.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 
 import java.io.IOException;
 import java.util.List;

+ 1 - 1
server/src/main/java/com/giantan/data/qa/service/QaCollectionService.java

@@ -1,7 +1,7 @@
 package com.giantan.data.qa.service;
 
 import com.giantan.data.common.ICollectionMetaService;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.kvs.repository.GRepository;
 import com.giantan.data.mds.service.CollectionInstance;

+ 1 - 1
server/src/main/java/com/giantan/data/qa/service/QaCollsSearchService.java

@@ -5,7 +5,7 @@ import com.giantan.data.common.service.GoeSimService;
 import com.giantan.data.index.HybridIndexer;
 import com.giantan.data.index.IHybridSearch;
 import com.giantan.data.index.dto.DocSearchResp;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.common.model.CollsSearchRequest;
 import com.giantan.data.qa.repository.QaDocRepository;
 import com.giantan.data.qa.repository.QaIndexer;

+ 1 - 1
server/src/main/java/com/giantan/data/qa/service/QaDocsService.java

@@ -3,7 +3,7 @@ package com.giantan.data.qa.service;
 import com.giantan.data.index.HybridIndexer;
 import com.giantan.data.index.IHybridSearch;
 import com.giantan.data.index.dto.DocSearchResp;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.qa.repository.QaDocRepository;
 import com.giantan.data.qa.repository.QaIndexer;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
server/src/main/java/com/giantan/data/qa/service/QaTaxonomyService.java

@@ -1,6 +1,6 @@
 package com.giantan.data.qa.service;
 
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.qa.repository.QaDocRepository;
 import com.giantan.data.qa.repository.QaTaxonomyRepository;

+ 2 - 2
server/src/main/java/com/giantan/data/qa/service/task/QaPersistentTaskService.java

@@ -2,9 +2,9 @@ package com.giantan.data.qa.service.task;
 
 import com.giantan.data.qa.service.QaCollectionService;
 import com.giantan.data.tasks.IPersistentTaskService;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.repository.TaskConverter;
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 
 import java.time.LocalDateTime;
 import java.util.List;

+ 1 - 0
server/src/main/java/com/giantan/data/qa/service/task/QasTaskHandler.java

@@ -3,6 +3,7 @@ package com.giantan.data.qa.service.task;
 import com.giantan.data.mds.task.impl.BaseTaskHandler;
 import com.giantan.data.qa.service.IQaDocsService;
 import com.giantan.data.tasks.*;
+import com.giantan.data.tasks.model.TaskContext;
 
 import java.io.IOException;
 import java.util.ArrayList;

+ 2 - 1
server/src/main/java/com/giantan/data/tasks/IPersistentTaskService.java

@@ -1,6 +1,7 @@
 package com.giantan.data.tasks;
 
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskContext;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 
 import java.time.LocalDateTime;
 import java.util.List;

+ 2 - 0
server/src/main/java/com/giantan/data/tasks/ITaskHandler.java

@@ -1,5 +1,7 @@
 package com.giantan.data.tasks;
 
+import com.giantan.data.tasks.model.TaskContext;
+
 public interface ITaskHandler {
     void handle(TaskContext context);
     TaskType getType();

+ 2 - 1
server/src/main/java/com/giantan/data/tasks/ITaskManager.java

@@ -1,6 +1,7 @@
 package com.giantan.data.tasks;
 
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskContext;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import com.google.common.eventbus.EventBus;
 
 import java.time.LocalDateTime;

+ 1 - 0
server/src/main/java/com/giantan/data/tasks/TaskEventListener.java

@@ -1,5 +1,6 @@
 package com.giantan.data.tasks;
 
+import com.giantan.data.tasks.model.TaskContext;
 import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.Subscribe;
 

+ 2 - 1
server/src/main/java/com/giantan/data/tasks/TaskManager.java

@@ -1,7 +1,8 @@
 package com.giantan.data.tasks;
 
 
-import com.giantan.data.tasks.repository.TaskStatusHistory;
+import com.giantan.data.tasks.model.TaskContext;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import com.google.common.eventbus.AsyncEventBus;
 import com.google.common.eventbus.EventBus;
 

+ 0 - 8
server/src/main/java/com/giantan/data/tasks/controller/TaskController.java

@@ -1,13 +1,5 @@
 package com.giantan.data.tasks.controller;
 
-import com.giantan.data.tasks.TaskContext;
-import com.giantan.data.tasks.TaskManager;
-import com.giantan.data.tasks.repository.TaskStatusHistory;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
 //@RestController
 //@RequestMapping("/api/tasks")
 public class TaskController {

+ 5 - 1
server/src/main/java/com/giantan/data/tasks/TaskContext.java → server/src/main/java/com/giantan/data/tasks/model/TaskContext.java

@@ -1,6 +1,10 @@
-package com.giantan.data.tasks;
+package com.giantan.data.tasks.model;
 
 
+import com.giantan.data.tasks.TaskOperationsStatus;
+import com.giantan.data.tasks.TaskState;
+import com.giantan.data.tasks.TaskType;
+
 import java.io.Serializable;
 import java.time.Instant;
 import java.util.ArrayList;

+ 1 - 2
server/src/main/java/com/giantan/data/tasks/repository/TaskStatusHistory.java → server/src/main/java/com/giantan/data/tasks/model/TaskStatusHistory.java

@@ -1,6 +1,5 @@
-package com.giantan.data.tasks.repository;
+package com.giantan.data.tasks.model;
 
-import com.giantan.data.tasks.TaskObjectStatus;
 import com.giantan.data.tasks.TaskOperationsStatus;
 import com.giantan.data.tasks.TaskState;
 import com.giantan.data.tasks.TaskType;

+ 1 - 0
server/src/main/java/com/giantan/data/tasks/repository/DynamicTaskRepository.java

@@ -8,6 +8,7 @@ import com.giantan.ai.util.id.UuidGenerator;
 import com.giantan.data.tasks.TaskOperationsStatus;
 import com.giantan.data.tasks.TaskState;
 import com.giantan.data.tasks.TaskType;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 

+ 2 - 1
server/src/main/java/com/giantan/data/tasks/repository/PersistentTaskManager.java

@@ -1,8 +1,9 @@
 package com.giantan.data.tasks.repository;
 
 import com.giantan.data.tasks.ITaskManager;
-import com.giantan.data.tasks.TaskContext;
+import com.giantan.data.tasks.model.TaskContext;
 import com.giantan.data.tasks.TaskType;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 import com.google.common.eventbus.EventBus;
 
 import java.time.LocalDateTime;

+ 2 - 0
server/src/main/java/com/giantan/data/tasks/repository/TaskConverter.java

@@ -1,6 +1,8 @@
 package com.giantan.data.tasks.repository;
 
 import com.giantan.data.tasks.*;
+import com.giantan.data.tasks.model.TaskContext;
+import com.giantan.data.tasks.model.TaskStatusHistory;
 
 import java.util.ArrayList;
 import java.util.HashMap;

+ 2 - 1
server/src/main/resources/application.yml

@@ -1,5 +1,6 @@
 server:
-  port: 18211
+#  port: 18211
+  port: 18203
 
 spring:
   application:

+ 1 - 1
server/src/test/java/com/giantan/data/mds/GRepositoryTest.java

@@ -1,7 +1,7 @@
 package com.giantan.data.mds;
 
 import com.giantan.data.kvs.constant.KvConfig;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.kvs.repository.GEntityConfig;
 import com.giantan.data.kvs.repository.GRepository;
 import com.giantan.data.qa.service.QaCollectionService;

+ 1 - 2
server/src/test/java/com/giantan/data/mds/MdsApplicationTests.java

@@ -1,7 +1,7 @@
 package com.giantan.data.mds;
 
 import com.giantan.data.index.IndexUtils;
-import com.giantan.data.kvs.kvstore.GBaseKeyValue;
+import com.giantan.data.common.model.GBaseKeyValue;
 import com.giantan.data.mds.bot.GChatClient;
 import com.giantan.data.index.HybridSearch;
 import com.giantan.data.mds.service.impl.MdChunksService;
@@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 

+ 12 - 0
server/src/test/java/com/giantan/data/mds/util/NlpToolsTest.java

@@ -0,0 +1,12 @@
+package com.giantan.data.mds.util;
+
+import java.util.List;
+
+public class NlpToolsTest {
+    public static void main(String[] args) {
+        String text = "snippets(代码片段)是用于快速插入重复代码模式的模板,如循环或条件语句,能显著提升开发效率。2024年6月起,JavaScript代码片段支持跨设备同步,保存至GitHub Gist实现多端共享。虽然日语中'断ち落とし'等词与' snippets'发音相似,但含义无关,需注意区分。在实际开发中,合理使用代码片段可减少错误、加速编码";
+        //List<Sentence> ss = NlpTools.splitSentences(text);
+        String s = NlpTools.generateSnippet(text, "JavaScript代码片段",300);
+        System.out.println(s);
+    }
+}