wangyunpeng пре 6 дана
родитељ
комит
06b58eaa6d

+ 12 - 14
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/VideoVectorMapper.java

@@ -2,16 +2,15 @@ package com.tzld.videoVector.dao.mapper.pgVector;
 
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
 import com.tzld.videoVector.model.po.pgVector.VideoVectorExample;
-import org.apache.ibatis.annotations.Param;
-
 import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 public interface VideoVectorMapper {
     /**
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     long countByExample(VideoVectorExample example);
 
@@ -19,7 +18,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int deleteByExample(VideoVectorExample example);
 
@@ -27,7 +26,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int deleteByPrimaryKey(Long id);
 
@@ -35,7 +34,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int insert(VideoVector record);
 
@@ -43,7 +42,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int insertSelective(VideoVector record);
 
@@ -51,7 +50,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     List<VideoVector> selectByExample(VideoVectorExample example);
 
@@ -59,7 +58,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     VideoVector selectByPrimaryKey(Long id);
 
@@ -67,7 +66,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int updateByExampleSelective(@Param("record") VideoVector record, @Param("example") VideoVectorExample example);
 
@@ -75,7 +74,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int updateByExample(@Param("record") VideoVector record, @Param("example") VideoVectorExample example);
 
@@ -83,7 +82,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int updateByPrimaryKeySelective(VideoVector record);
 
@@ -91,8 +90,7 @@ public interface VideoVectorMapper {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     int updateByPrimaryKey(VideoVector record);
-
 }

+ 5 - 2
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/VideoVectorMapperExt.java

@@ -1,6 +1,7 @@
 package com.tzld.videoVector.dao.mapper.pgVector.ext;
 
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
+import com.tzld.videoVector.model.vo.VideoVectorSearchResult;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
@@ -15,11 +16,13 @@ public interface VideoVectorMapperExt {
      * @param configCode 配置编码
      * @param pointIndex 向量点索引(单点模式传0)
      * @param embedding  向量字符串,格式: "[0.1,0.2,...]"
+     * @param text       向量化的原始文本内容
      */
     int upsertVector(@Param("videoId") Long videoId,
                      @Param("configCode") String configCode,
                      @Param("pointIndex") int pointIndex,
-                     @Param("embedding") String embedding);
+                     @Param("embedding") String embedding,
+                     @Param("text") String text);
 
     /**
      * 判断指定 videoId + configCode 的向量是否存在(任意 pointIndex)
@@ -69,7 +72,7 @@ public interface VideoVectorMapperExt {
      * @param topN        返回数量
      * @return VideoVector 列表(包含 videoId、pointIndex 和相似度得分)
      */
-    List<VideoVector> searchTopNByCosine(@Param("configCode") String configCode,
+    List<VideoVectorSearchResult> searchTopNByCosine(@Param("configCode") String configCode,
                                         @Param("queryVector") String queryVector,
                                         @Param("topN") int topN);
 }

+ 1 - 1
core/src/main/java/com/tzld/videoVector/job/DataMigrationJob.java

@@ -301,7 +301,7 @@ public class DataMigrationJob {
 
                             // Redis 中存储的是归一化后的 JSON 数组 "[0.1,0.2,...]"
                             // pgvector 接受此格式
-                            pgVideoVectorMapper.upsertVector(videoId, configCode, 0, vectorJson);
+                            pgVideoVectorMapper.upsertVector(videoId, configCode, 0, vectorJson, null);
                             totalSuccess++;
                         } catch (NumberFormatException e) {
                             log.warn("非法 videoId: {}", idStr);

+ 2 - 2
core/src/main/java/com/tzld/videoVector/job/VideoVectorJob.java

@@ -412,7 +412,7 @@ public class VideoVectorJob {
                     log.warn("videoId={} 配置 {} 第{}个文本向量化失败", videoId, configCode, i);
                     continue;
                 }
-                vectorStoreService.save(configCode, videoId, i, vector);
+                vectorStoreService.save(configCode, videoId, i, vector, text);
                 log.debug("videoId={} 配置 {} 第{}个点向量化存储成功", videoId, configCode, i);
                 successCount++;
             }
@@ -438,7 +438,7 @@ public class VideoVectorJob {
                 log.warn("videoId={} 配置 {} 文本向量化失败", videoId, configCode);
                 return 0;
             }
-            vectorStoreService.save(configCode, videoId, vector);
+            vectorStoreService.save(configCode, videoId, vector, text);
             log.debug("videoId={} 配置 {} 向量化存储成功", videoId, configCode);
             return 1;
         }

+ 89 - 44
core/src/main/java/com/tzld/videoVector/model/po/pgVector/VideoVector.java

@@ -4,7 +4,7 @@ import java.util.Date;
 
 /**
  * Database Table Remarks:
- *   视频向量存储表:存储视频各维度的embedding向量,支持单点和多点模式
+ *   视频向量存储表
  *
  * This class was generated by MyBatis Generator.
  * This class corresponds to the database table video_vectors
@@ -17,7 +17,7 @@ public class VideoVector {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database column video_vectors.id
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     private Long id;
 
@@ -28,7 +28,7 @@ public class VideoVector {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database column video_vectors.video_id
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     private Long videoId;
 
@@ -39,10 +39,21 @@ public class VideoVector {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database column video_vectors.config_code
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     private String configCode;
 
+    /**
+     * Database Column Remarks:
+     *   向量数据(pgvector vector(1024)类型,余弦距离检索)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_vectors.embedding
+     *
+     * @mbg.generated
+     */
+    private String embedding;
+
     /**
      * Database Column Remarks:
      *   创建时间
@@ -50,7 +61,7 @@ public class VideoVector {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database column video_vectors.created_at
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     private Date createdAt;
 
@@ -61,7 +72,7 @@ public class VideoVector {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database column video_vectors.updated_at
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     private Date updatedAt;
 
@@ -72,36 +83,20 @@ public class VideoVector {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database column video_vectors.point_index
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     private Integer pointIndex;
 
     /**
-     * embedding 向量字段(vector(1024)类型,以字符串形式传递)
-     * 格式示例: "[0.1,0.2,...]"
-     */
-    private String embedding;
-
-    public String getEmbedding() {
-        return embedding;
-    }
-
-    public void setEmbedding(String embedding) {
-        this.embedding = embedding;
-    }
-
-    /**
-     * 余弦相似度得分(仅搜索时使用,非持久化字段)
+     * Database Column Remarks:
+     *   向量化的原始文本内容
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_vectors.text
+     *
+     * @mbg.generated
      */
-    private Double score;
-
-    public Double getScore() {
-        return score;
-    }
-
-    public void setScore(Double score) {
-        this.score = score;
-    }
+    private String text;
 
     /**
      * This method was generated by MyBatis Generator.
@@ -109,7 +104,7 @@ public class VideoVector {
      *
      * @return the value of video_vectors.id
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Long getId() {
         return id;
@@ -121,7 +116,7 @@ public class VideoVector {
      *
      * @param id the value for video_vectors.id
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setId(Long id) {
         this.id = id;
@@ -133,7 +128,7 @@ public class VideoVector {
      *
      * @return the value of video_vectors.video_id
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Long getVideoId() {
         return videoId;
@@ -145,7 +140,7 @@ public class VideoVector {
      *
      * @param videoId the value for video_vectors.video_id
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setVideoId(Long videoId) {
         this.videoId = videoId;
@@ -157,7 +152,7 @@ public class VideoVector {
      *
      * @return the value of video_vectors.config_code
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public String getConfigCode() {
         return configCode;
@@ -169,19 +164,43 @@ public class VideoVector {
      *
      * @param configCode the value for video_vectors.config_code
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setConfigCode(String configCode) {
         this.configCode = configCode;
     }
 
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column video_vectors.embedding
+     *
+     * @return the value of video_vectors.embedding
+     *
+     * @mbg.generated
+     */
+    public String getEmbedding() {
+        return embedding;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column video_vectors.embedding
+     *
+     * @param embedding the value for video_vectors.embedding
+     *
+     * @mbg.generated
+     */
+    public void setEmbedding(String embedding) {
+        this.embedding = embedding;
+    }
+
     /**
      * This method was generated by MyBatis Generator.
      * This method returns the value of the database column video_vectors.created_at
      *
      * @return the value of video_vectors.created_at
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Date getCreatedAt() {
         return createdAt;
@@ -193,7 +212,7 @@ public class VideoVector {
      *
      * @param createdAt the value for video_vectors.created_at
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setCreatedAt(Date createdAt) {
         this.createdAt = createdAt;
@@ -205,7 +224,7 @@ public class VideoVector {
      *
      * @return the value of video_vectors.updated_at
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Date getUpdatedAt() {
         return updatedAt;
@@ -217,7 +236,7 @@ public class VideoVector {
      *
      * @param updatedAt the value for video_vectors.updated_at
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setUpdatedAt(Date updatedAt) {
         this.updatedAt = updatedAt;
@@ -229,7 +248,7 @@ public class VideoVector {
      *
      * @return the value of video_vectors.point_index
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Integer getPointIndex() {
         return pointIndex;
@@ -241,17 +260,41 @@ public class VideoVector {
      *
      * @param pointIndex the value for video_vectors.point_index
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setPointIndex(Integer pointIndex) {
         this.pointIndex = pointIndex;
     }
 
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column video_vectors.text
+     *
+     * @return the value of video_vectors.text
+     *
+     * @mbg.generated
+     */
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column video_vectors.text
+     *
+     * @param text the value for video_vectors.text
+     *
+     * @mbg.generated
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
     /**
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     @Override
     public String toString() {
@@ -262,9 +305,11 @@ public class VideoVector {
         sb.append(", id=").append(id);
         sb.append(", videoId=").append(videoId);
         sb.append(", configCode=").append(configCode);
+        sb.append(", embedding=").append(embedding);
         sb.append(", createdAt=").append(createdAt);
         sb.append(", updatedAt=").append(updatedAt);
         sb.append(", pointIndex=").append(pointIndex);
+        sb.append(", text=").append(text);
         sb.append("]");
         return sb.toString();
     }

+ 147 - 17
core/src/main/java/com/tzld/videoVector/model/po/pgVector/VideoVectorExample.java

@@ -9,7 +9,7 @@ public class VideoVectorExample {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     protected String orderByClause;
 
@@ -17,7 +17,7 @@ public class VideoVectorExample {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     protected boolean distinct;
 
@@ -25,7 +25,7 @@ public class VideoVectorExample {
      * This field was generated by MyBatis Generator.
      * This field corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     protected List<Criteria> oredCriteria;
 
@@ -33,7 +33,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public VideoVectorExample() {
         oredCriteria = new ArrayList<Criteria>();
@@ -43,7 +43,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setOrderByClause(String orderByClause) {
         this.orderByClause = orderByClause;
@@ -53,7 +53,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public String getOrderByClause() {
         return orderByClause;
@@ -63,7 +63,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void setDistinct(boolean distinct) {
         this.distinct = distinct;
@@ -73,7 +73,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public boolean isDistinct() {
         return distinct;
@@ -83,7 +83,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public List<Criteria> getOredCriteria() {
         return oredCriteria;
@@ -93,7 +93,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void or(Criteria criteria) {
         oredCriteria.add(criteria);
@@ -103,7 +103,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Criteria or() {
         Criteria criteria = createCriteriaInternal();
@@ -115,7 +115,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public Criteria createCriteria() {
         Criteria criteria = createCriteriaInternal();
@@ -129,7 +129,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     protected Criteria createCriteriaInternal() {
         Criteria criteria = new Criteria();
@@ -140,7 +140,7 @@ public class VideoVectorExample {
      * This method was generated by MyBatis Generator.
      * This method corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public void clear() {
         oredCriteria.clear();
@@ -152,7 +152,7 @@ public class VideoVectorExample {
      * This class was generated by MyBatis Generator.
      * This class corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     protected abstract static class GeneratedCriteria {
         protected List<Criterion> criteria;
@@ -385,6 +385,66 @@ public class VideoVectorExample {
             return (Criteria) this;
         }
 
+        public Criteria andEmbeddingIsNull() {
+            addCriterion("embedding is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingIsNotNull() {
+            addCriterion("embedding is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingEqualTo(String value) {
+            addCriterion("embedding =", value, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingNotEqualTo(String value) {
+            addCriterion("embedding <>", value, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingGreaterThan(String value) {
+            addCriterion("embedding >", value, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingGreaterThanOrEqualTo(String value) {
+            addCriterion("embedding >=", value, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingLessThan(String value) {
+            addCriterion("embedding <", value, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingLessThanOrEqualTo(String value) {
+            addCriterion("embedding <=", value, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingIn(List<String> values) {
+            addCriterion("embedding in", values, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingNotIn(List<String> values) {
+            addCriterion("embedding not in", values, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingBetween(String value1, String value2) {
+            addCriterion("embedding between", value1, value2, "embedding");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingNotBetween(String value1, String value2) {
+            addCriterion("embedding not between", value1, value2, "embedding");
+            return (Criteria) this;
+        }
+
         public Criteria andCreatedAtIsNull() {
             addCriterion("created_at is null");
             return (Criteria) this;
@@ -564,13 +624,83 @@ public class VideoVectorExample {
             addCriterion("point_index not between", value1, value2, "pointIndex");
             return (Criteria) this;
         }
+
+        public Criteria andTextIsNull() {
+            addCriterion("\"text\" is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextIsNotNull() {
+            addCriterion("\"text\" is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextEqualTo(String value) {
+            addCriterion("\"text\" =", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextNotEqualTo(String value) {
+            addCriterion("\"text\" <>", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextGreaterThan(String value) {
+            addCriterion("\"text\" >", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextGreaterThanOrEqualTo(String value) {
+            addCriterion("\"text\" >=", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextLessThan(String value) {
+            addCriterion("\"text\" <", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextLessThanOrEqualTo(String value) {
+            addCriterion("\"text\" <=", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextLike(String value) {
+            addCriterion("\"text\" like", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextNotLike(String value) {
+            addCriterion("\"text\" not like", value, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextIn(List<String> values) {
+            addCriterion("\"text\" in", values, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextNotIn(List<String> values) {
+            addCriterion("\"text\" not in", values, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextBetween(String value1, String value2) {
+            addCriterion("\"text\" between", value1, value2, "text");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextNotBetween(String value1, String value2) {
+            addCriterion("\"text\" not between", value1, value2, "text");
+            return (Criteria) this;
+        }
     }
 
     /**
      * This class was generated by MyBatis Generator.
      * This class corresponds to the database table video_vectors
      *
-     * @mbg.generated do_not_delete_during_merge Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated do_not_delete_during_merge
      */
     public static class Criteria extends GeneratedCriteria {
 
@@ -583,7 +713,7 @@ public class VideoVectorExample {
      * This class was generated by MyBatis Generator.
      * This class corresponds to the database table video_vectors
      *
-     * @mbg.generated Wed Apr 29 19:29:43 CST 2026
+     * @mbg.generated
      */
     public static class Criterion {
         private String condition;

+ 47 - 0
core/src/main/java/com/tzld/videoVector/model/vo/VideoVectorSearchResult.java

@@ -0,0 +1,47 @@
+package com.tzld.videoVector.model.vo;
+
+/**
+ * 视频向量搜索结果 DTO(余弦相似度搜索返回)
+ */
+public class VideoVectorSearchResult {
+
+    /** 视频ID */
+    private Long videoId;
+
+    /** 向量点索引 */
+    private Integer pointIndex;
+
+    /** 余弦相似度得分 */
+    private Double score;
+
+    public Long getVideoId() {
+        return videoId;
+    }
+
+    public void setVideoId(Long videoId) {
+        this.videoId = videoId;
+    }
+
+    public Integer getPointIndex() {
+        return pointIndex;
+    }
+
+    public void setPointIndex(Integer pointIndex) {
+        this.pointIndex = pointIndex;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    @Override
+    public String toString() {
+        return "VideoVectorSearchResult{videoId=" + videoId +
+                ", pointIndex=" + pointIndex +
+                ", score=" + score + "}";
+    }
+}

+ 6 - 3
core/src/main/java/com/tzld/videoVector/service/VectorStoreService.java

@@ -21,16 +21,18 @@ public interface VectorStoreService {
      * 保存视频向量(默认配置)
      * @param videoId 视频ID
      * @param vector  向量数据
+     * @param text    向量化的原始文本内容
      */
-    void save(Long videoId, List<Float> vector);
+    void save(Long videoId, List<Float> vector, String text);
 
     /**
      * 保存视频向量(指定配置,单点模式 pointIndex=0)
      * @param configCode 配置编码
      * @param videoId    视频ID
      * @param vector     向量数据
+     * @param text       向量化的原始文本内容
      */
-    void save(String configCode, Long videoId, List<Float> vector);
+    void save(String configCode, Long videoId, List<Float> vector, String text);
 
     /**
      * 保存视频向量(指定配置 + 点索引,支持多点模式)
@@ -38,8 +40,9 @@ public interface VectorStoreService {
      * @param videoId    视频ID
      * @param pointIndex 向量点索引(单点模式传0,多点模式传 0,1,2,...)
      * @param vector     向量数据
+     * @param text       向量化的原始文本内容
      */
-    void save(String configCode, Long videoId, int pointIndex, List<Float> vector);
+    void save(String configCode, Long videoId, int pointIndex, List<Float> vector, String text);
 
     /**
      * 判断某个 videoId 的向量是否已存在(默认配置)

+ 8 - 7
core/src/main/java/com/tzld/videoVector/service/impl/PgVectorStoreServiceImpl.java

@@ -3,6 +3,7 @@ package com.tzld.videoVector.service.impl;
 import com.tzld.videoVector.dao.mapper.pgVector.ext.VideoVectorMapperExt;
 import com.tzld.videoVector.model.entity.VideoMatch;
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
+import com.tzld.videoVector.model.vo.VideoVectorSearchResult;
 import com.tzld.videoVector.service.VectorStoreService;
 import com.tzld.videoVector.util.VectorUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -35,17 +36,17 @@ public class PgVectorStoreServiceImpl implements VectorStoreService {
     // ---------------------------------------------------------------- CRUD
 
     @Override
-    public void save(Long videoId, List<Float> vector) {
-        save(DEFAULT_CONFIG_CODE, videoId, vector);
+    public void save(Long videoId, List<Float> vector, String text) {
+        save(DEFAULT_CONFIG_CODE, videoId, vector, text);
     }
 
     @Override
-    public void save(String configCode, Long videoId, List<Float> vector) {
-        save(configCode, videoId, 0, vector);
+    public void save(String configCode, Long videoId, List<Float> vector, String text) {
+        save(configCode, videoId, 0, vector, text);
     }
 
     @Override
-    public void save(String configCode, Long videoId, int pointIndex, List<Float> vector) {
+    public void save(String configCode, Long videoId, int pointIndex, List<Float> vector, String text) {
         if (videoId == null || vector == null || vector.isEmpty()) {
             log.warn("save 参数非法,configCode={}, videoId={}", configCode, videoId);
             return;
@@ -55,7 +56,7 @@ public class PgVectorStoreServiceImpl implements VectorStoreService {
         }
 
         String embedding = vectorToString(vector);
-        videoVectorMapper.upsertVector(videoId, configCode, pointIndex, embedding);
+        videoVectorMapper.upsertVector(videoId, configCode, pointIndex, embedding, text);
         log.debug("保存向量成功,configCode={}, videoId={}, pointIndex={}, 维度={}", configCode, videoId, pointIndex, vector.size());
     }
 
@@ -219,7 +220,7 @@ public class PgVectorStoreServiceImpl implements VectorStoreService {
         String queryVectorStr = vectorToString(queryVector);
         log.info("开始pgvector搜索,configCode={},topN={}", configCode, topN);
 
-        List<VideoVector> results = videoVectorMapper.searchTopNByCosine(configCode, queryVectorStr, topN);
+        List<VideoVectorSearchResult> results = videoVectorMapper.searchTopNByCosine(configCode, queryVectorStr, topN);
         if (results == null || results.isEmpty()) {
             log.info("向量库为空或无匹配结果,configCode={}", configCode);
             return Collections.emptyList();

+ 5 - 5
core/src/main/java/com/tzld/videoVector/service/impl/RedisVectorStoreServiceImpl.java

@@ -61,17 +61,17 @@ public class RedisVectorStoreServiceImpl implements VectorStoreService {
     // ---------------------------------------------------------------- CRUD
 
     @Override
-    public void save(Long videoId, List<Float> vector) {
-        save(DEFAULT_CONFIG_CODE, videoId, vector);
+    public void save(Long videoId, List<Float> vector, String text) {
+        save(DEFAULT_CONFIG_CODE, videoId, vector, text);
     }
 
     @Override
-    public void save(String configCode, Long videoId, List<Float> vector) {
-        save(configCode, videoId, 0, vector);
+    public void save(String configCode, Long videoId, List<Float> vector, String text) {
+        save(configCode, videoId, 0, vector, text);
     }
 
     @Override
-    public void save(String configCode, Long videoId, int pointIndex, List<Float> vector) {
+    public void save(String configCode, Long videoId, int pointIndex, List<Float> vector, String text) {
         if (videoId == null || vector == null || vector.isEmpty()) {
             log.warn("save 参数非法,configCode={}, videoId={}", configCode, videoId);
             return;

+ 6 - 4
core/src/main/resources/generator/mybatis-pgvector-generator-config.xml

@@ -21,6 +21,8 @@
 
         <commentGenerator>
             <property name="addRemarkComments" value="true"/>
+            <property name="suppressDate" value="true"/>
+            <property name="suppressAllComments" value="false"/>
         </commentGenerator>
 
         <!-- PostgreSQL 17 连接配置 -->
@@ -52,18 +54,18 @@
             <property name="enableSubPackages" value="true"/>
         </javaClientGenerator>
 
-        <!-- 视频向量主表(embedding 列类型 MBG 不识别,生成后需手动补充) -->
+        <!-- 视频向量主表 -->
         <table tableName="video_vectors" domainObjectName="VideoVector" alias="">
             <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
-            <!-- pgvector 的 vector 类型 MBG 无法自动映射,忽略后手动补充 -->
-            <ignoreColumn column="embedding"/>
+            <!-- pgvector 的 vector 类型强制映射为 String -->
+            <columnOverride column="embedding" javaType="java.lang.String" jdbcType="VARCHAR"/>
         </table>
 
         <!-- 素材向量表(embedding 列类型 MBG 不识别,生成后需手动补充) -->
 <!--        <table tableName="content_vectors" domainObjectName="ContentVector" alias="">-->
 <!--            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>-->
 <!--            &lt;!&ndash; pgvector 的 vector 类型 MBG 无法自动映射,忽略后手动补充 &ndash;&gt;-->
-<!--            <ignoreColumn column="embedding"/>-->
+<!--            <columnOverride column="embedding" javaType="java.lang.String" jdbcType="VARCHAR"/>-->
 <!--        </table>-->
 
         <!-- 内容解构主表 -->

+ 39 - 23
core/src/main/resources/mapper/pgVector/VideoVectorMapper.xml

@@ -5,20 +5,20 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="video_id" jdbcType="BIGINT" property="videoId" />
     <result column="config_code" jdbcType="VARCHAR" property="configCode" />
+    <result column="embedding" jdbcType="VARCHAR" property="embedding" />
     <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
     <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
     <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
+    <result column="text" jdbcType="VARCHAR" property="text" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     <where>
       <foreach collection="oredCriteria" item="criteria" separator="or">
@@ -52,7 +52,6 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     <where>
       <foreach collection="example.oredCriteria" item="criteria" separator="or">
@@ -86,15 +85,13 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
-    id, video_id, config_code, created_at, updated_at, point_index
+    id, video_id, config_code, embedding, created_at, updated_at, point_index, "text"
   </sql>
   <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.VideoVectorExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     select
     <if test="distinct">
@@ -113,7 +110,6 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     select 
     <include refid="Base_Column_List" />
@@ -124,7 +120,6 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     delete from video_vectors
     where id = #{id,jdbcType=BIGINT}
@@ -133,7 +128,6 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     delete from video_vectors
     <if test="_parameter != null">
@@ -144,18 +138,18 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
-    insert into video_vectors (video_id, config_code, created_at, 
-      updated_at, point_index)
-    values (#{videoId,jdbcType=BIGINT}, #{configCode,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, 
-      #{updatedAt,jdbcType=TIMESTAMP}, #{pointIndex,jdbcType=INTEGER})
+    insert into video_vectors (video_id, config_code, embedding, 
+      created_at, updated_at, point_index, 
+      "text")
+    values (#{videoId,jdbcType=BIGINT}, #{configCode,jdbcType=VARCHAR}, #{embedding,jdbcType=VARCHAR}, 
+      #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, #{pointIndex,jdbcType=INTEGER}, 
+      #{text,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.VideoVector" useGeneratedKeys="true">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     insert into video_vectors
     <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -165,6 +159,9 @@
       <if test="configCode != null">
         config_code,
       </if>
+      <if test="embedding != null">
+        embedding,
+      </if>
       <if test="createdAt != null">
         created_at,
       </if>
@@ -174,6 +171,9 @@
       <if test="pointIndex != null">
         point_index,
       </if>
+      <if test="text != null">
+        "text",
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="videoId != null">
@@ -182,6 +182,9 @@
       <if test="configCode != null">
         #{configCode,jdbcType=VARCHAR},
       </if>
+      <if test="embedding != null">
+        #{embedding,jdbcType=VARCHAR},
+      </if>
       <if test="createdAt != null">
         #{createdAt,jdbcType=TIMESTAMP},
       </if>
@@ -191,13 +194,15 @@
       <if test="pointIndex != null">
         #{pointIndex,jdbcType=INTEGER},
       </if>
+      <if test="text != null">
+        #{text,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.tzld.videoVector.model.po.pgVector.VideoVectorExample" resultType="java.lang.Long">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     select count(*) from video_vectors
     <if test="_parameter != null">
@@ -208,7 +213,6 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     update video_vectors
     <set>
@@ -221,6 +225,9 @@
       <if test="record.configCode != null">
         config_code = #{record.configCode,jdbcType=VARCHAR},
       </if>
+      <if test="record.embedding != null">
+        embedding = #{record.embedding,jdbcType=VARCHAR},
+      </if>
       <if test="record.createdAt != null">
         created_at = #{record.createdAt,jdbcType=TIMESTAMP},
       </if>
@@ -230,6 +237,9 @@
       <if test="record.pointIndex != null">
         point_index = #{record.pointIndex,jdbcType=INTEGER},
       </if>
+      <if test="record.text != null">
+        "text" = #{record.text,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -239,15 +249,16 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     update video_vectors
     set id = #{record.id,jdbcType=BIGINT},
       video_id = #{record.videoId,jdbcType=BIGINT},
       config_code = #{record.configCode,jdbcType=VARCHAR},
+      embedding = #{record.embedding,jdbcType=VARCHAR},
       created_at = #{record.createdAt,jdbcType=TIMESTAMP},
       updated_at = #{record.updatedAt,jdbcType=TIMESTAMP},
-      point_index = #{record.pointIndex,jdbcType=INTEGER}
+      point_index = #{record.pointIndex,jdbcType=INTEGER},
+      "text" = #{record.text,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -256,7 +267,6 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     update video_vectors
     <set>
@@ -266,6 +276,9 @@
       <if test="configCode != null">
         config_code = #{configCode,jdbcType=VARCHAR},
       </if>
+      <if test="embedding != null">
+        embedding = #{embedding,jdbcType=VARCHAR},
+      </if>
       <if test="createdAt != null">
         created_at = #{createdAt,jdbcType=TIMESTAMP},
       </if>
@@ -275,6 +288,9 @@
       <if test="pointIndex != null">
         point_index = #{pointIndex,jdbcType=INTEGER},
       </if>
+      <if test="text != null">
+        "text" = #{text,jdbcType=VARCHAR},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -282,15 +298,15 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Wed Apr 29 19:29:43 CST 2026.
     -->
     update video_vectors
     set video_id = #{videoId,jdbcType=BIGINT},
       config_code = #{configCode,jdbcType=VARCHAR},
+      embedding = #{embedding,jdbcType=VARCHAR},
       created_at = #{createdAt,jdbcType=TIMESTAMP},
       updated_at = #{updatedAt,jdbcType=TIMESTAMP},
-      point_index = #{pointIndex,jdbcType=INTEGER}
+      point_index = #{pointIndex,jdbcType=INTEGER},
+      "text" = #{text,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>
-
 </mapper>

+ 4 - 4
core/src/main/resources/mapper/pgVector/ext/VideoVectorMapperExt.xml

@@ -16,7 +16,7 @@
   </resultMap>
 
   <!-- 余弦相似度搜索 Top-N(返回 videoId + pointIndex + score) -->
-  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
+  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.vo.VideoVectorSearchResult">
     <result column="video_id" jdbcType="BIGINT" property="videoId" />
     <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
     <result column="score" jdbcType="DOUBLE" property="score" />
@@ -26,10 +26,10 @@
 
   <!-- Upsert: 插入或更新向量(支持多点模式) -->
   <insert id="upsertVector">
-    INSERT INTO video_vectors (video_id, config_code, point_index, embedding, created_at, updated_at)
-    VALUES (#{videoId}, #{configCode}, #{pointIndex}, #{embedding}::vector, NOW(), NOW())
+    INSERT INTO video_vectors (video_id, config_code, point_index, embedding, text, created_at, updated_at)
+    VALUES (#{videoId}, #{configCode}, #{pointIndex}, #{embedding}::vector, #{text}, NOW(), NOW())
     ON CONFLICT (config_code, video_id, point_index)
-    DO UPDATE SET embedding = EXCLUDED.embedding, updated_at = NOW()
+    DO UPDATE SET embedding = EXCLUDED.embedding, text = EXCLUDED.text, updated_at = NOW()
   </insert>
 
   <!-- 判断是否存在(任意 pointIndex) -->