فهرست منبع

自定义sql提取

wangyunpeng 1 هفته پیش
والد
کامیت
c8f6e9b274
16فایلهای تغییر یافته به همراه399 افزوده شده و 341 حذف شده
  1. 0 51
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ContentVectorMapper.java
  2. 0 6
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/DeconstructVectorConfigMapper.java
  3. 2 67
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/VideoVectorMapper.java
  4. 61 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/ContentVectorMapperExt.java
  5. 18 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/DeconstructVectorConfigMapperExt.java
  6. 75 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/VideoVectorMapperExt.java
  7. 4 4
      core/src/main/java/com/tzld/videoVector/job/DataMigrationJob.java
  8. 2 2
      core/src/main/java/com/tzld/videoVector/service/impl/PgVectorStoreServiceImpl.java
  9. 4 4
      core/src/main/java/com/tzld/videoVector/service/impl/VectorizeServiceImpl.java
  10. 2 2
      core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java
  11. 0 101
      core/src/main/resources/mapper/pgVector/ContentVectorMapper.xml
  12. 0 14
      core/src/main/resources/mapper/pgVector/DeconstructVectorConfigMapper.xml
  13. 0 90
      core/src/main/resources/mapper/pgVector/VideoVectorMapper.xml
  14. 108 0
      core/src/main/resources/mapper/pgVector/ext/ContentVectorMapperExt.xml
  15. 26 0
      core/src/main/resources/mapper/pgVector/ext/DeconstructVectorConfigMapperExt.xml
  16. 97 0
      core/src/main/resources/mapper/pgVector/ext/VideoVectorMapperExt.xml

+ 0 - 51
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ContentVectorMapper.java

@@ -94,55 +94,4 @@ public interface ContentVectorMapper {
      */
      */
     int updateByPrimaryKey(ContentVector record);
     int updateByPrimaryKey(ContentVector record);
 
 
-    // ==================== 自定义向量操作方法 ====================
-
-    /**
-     * 插入向量(含 embedding,通过 ON CONFLICT 去重)
-     */
-    int upsertWithEmbedding(@Param("contentId") Long contentId,
-                            @Param("taskId") String taskId,
-                            @Param("configCode") String configCode,
-                            @Param("sourceField") String sourceField,
-                            @Param("sourcePath") String sourcePath,
-                            @Param("textHash") String textHash,
-                            @Param("embeddingModel") String embeddingModel,
-                            @Param("segmentIndex") Integer segmentIndex,
-                            @Param("segmentTotal") Integer segmentTotal,
-                            @Param("sourceText") String sourceText,
-                            @Param("embedding") String embedding);
-
-    /**
-     * 根据 contentId + configCode 查询向量列表(含 embedding)
-     */
-    List<ContentVector> selectByContentIdAndConfigCode(@Param("contentId") Long contentId,
-                                                       @Param("configCode") String configCode);
-
-    /**
-     * 根据 contentId 查询向量列表(含 embedding)
-     */
-    List<ContentVector> selectByContentId(@Param("contentId") Long contentId);
-
-    /**
-     * 根据 contentId + sourceField 查询向量
-     */
-    List<ContentVector> selectByContentIdAndField(@Param("contentId") Long contentId,
-                                                  @Param("sourceField") String sourceField);
-
-    /**
-     * 根据 textHash + configCode 查询已缓存的向量
-     */
-    ContentVector selectByTextHashAndConfigCode(@Param("textHash") String textHash,
-                                                @Param("configCode") String configCode);
-
-    /**
-     * 根据 textHash 查询向量(不限 configCode)
-     */
-    ContentVector selectByTextHash(@Param("textHash") String textHash);
-
-    /**
-     * 余弦相似度搜索 Top-N
-     */
-    List<ContentVector> searchTopNByCosine(@Param("configCode") String configCode,
-                                           @Param("queryVector") String queryVector,
-                                           @Param("topN") int topN);
 }
 }

+ 0 - 6
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/DeconstructVectorConfigMapper.java

@@ -94,10 +94,4 @@ public interface DeconstructVectorConfigMapper {
      */
      */
     int updateByPrimaryKey(DeconstructVectorConfig record);
     int updateByPrimaryKey(DeconstructVectorConfig record);
 
 
-    /**
-     * 按业务类型和内容类型查询启用的向量配置,支持 null 表示通配所有类型
-     */
-    List<DeconstructVectorConfig> selectMatchingConfigs(
-            @Param("bizType") Short bizType,
-            @Param("contentType") Short contentType);
 }
 }

+ 2 - 67
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/VideoVectorMapper.java

@@ -2,10 +2,10 @@ package com.tzld.videoVector.dao.mapper.pgVector;
 
 
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
 import com.tzld.videoVector.model.po.pgVector.VideoVectorExample;
 import com.tzld.videoVector.model.po.pgVector.VideoVectorExample;
-import java.util.List;
-import java.util.Set;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
+import java.util.List;
+
 public interface VideoVectorMapper {
 public interface VideoVectorMapper {
     /**
     /**
      * This method was generated by MyBatis Generator.
      * This method was generated by MyBatis Generator.
@@ -95,69 +95,4 @@ public interface VideoVectorMapper {
      */
      */
     int updateByPrimaryKey(VideoVector record);
     int updateByPrimaryKey(VideoVector record);
 
 
-    // ==================== 自定义向量操作方法 ====================
-
-    /**
-     * 插入或更新向量(ON CONFLICT 语义,支持多点模式)
-     * @param videoId    视频ID
-     * @param configCode 配置编码
-     * @param pointIndex 向量点索引(单点模式传0)
-     * @param embedding  向量字符串,格式: "[0.1,0.2,...]"
-     */
-    int upsertVector(@Param("videoId") Long videoId,
-                     @Param("configCode") String configCode,
-                     @Param("pointIndex") int pointIndex,
-                     @Param("embedding") String embedding);
-
-    /**
-     * 判断指定 videoId + configCode 的向量是否存在(任意 pointIndex)
-     */
-    int existsByVideoIdAndConfigCode(@Param("videoId") Long videoId,
-                                     @Param("configCode") String configCode);
-
-    /**
-     * 批量判断 videoIds 在指定 configCode 下是否存在,返回已存在的 videoId 列表(去重)
-     */
-    List<Long> selectExistingVideoIds(@Param("videoIds") List<Long> videoIds,
-                                      @Param("configCode") String configCode);
-
-    /**
-     * 获取指定 videoId + configCode 的向量(以字符串形式返回,取 pointIndex=0)
-     */
-    String selectEmbeddingByVideoIdAndConfigCode(@Param("videoId") Long videoId,
-                                                 @Param("configCode") String configCode);
-
-    /**
-     * 批量获取向量
-     */
-    List<VideoVector> selectVectorsByVideoIds(@Param("videoIds") List<Long> videoIds,
-                                             @Param("configCode") String configCode);
-
-    /**
-     * 获取指定 configCode 下所有 videoId(去重)
-     */
-    List<Long> selectAllVideoIdsByConfigCode(@Param("configCode") String configCode);
-
-    /**
-     * 删除指定 videoId + configCode 的所有向量点
-     */
-    int deleteByVideoIdAndConfigCode(@Param("videoId") Long videoId,
-                                     @Param("configCode") String configCode);
-
-    /**
-     * 批量删除指定 videoIds + configCode 的所有向量点
-     */
-    int deleteBatchByVideoIdsAndConfigCode(@Param("videoIds") List<Long> videoIds,
-                                           @Param("configCode") String configCode);
-
-    /**
-     * 余弦相似度搜索 Top-N
-     * @param configCode  配置编码
-     * @param queryVector 查询向量字符串
-     * @param topN        返回数量
-     * @return VideoVector 列表(包含 videoId、pointIndex 和相似度得分)
-     */
-    List<VideoVector> searchTopNByCosine(@Param("configCode") String configCode,
-                                        @Param("queryVector") String queryVector,
-                                        @Param("topN") int topN);
 }
 }

+ 61 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/ContentVectorMapperExt.java

@@ -0,0 +1,61 @@
+package com.tzld.videoVector.dao.mapper.pgVector.ext;
+
+import com.tzld.videoVector.model.po.pgVector.ContentVector;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * ContentVector 自定义向量操作 Mapper(与 MBG 生成的基础 Mapper 分离)
+ */
+public interface ContentVectorMapperExt {
+
+    /**
+     * 插入向量(含 embedding,通过 ON CONFLICT 去重)
+     */
+    int upsertWithEmbedding(@Param("contentId") Long contentId,
+                            @Param("taskId") String taskId,
+                            @Param("configCode") String configCode,
+                            @Param("sourceField") String sourceField,
+                            @Param("sourcePath") String sourcePath,
+                            @Param("textHash") String textHash,
+                            @Param("embeddingModel") String embeddingModel,
+                            @Param("segmentIndex") Integer segmentIndex,
+                            @Param("segmentTotal") Integer segmentTotal,
+                            @Param("sourceText") String sourceText,
+                            @Param("embedding") String embedding);
+
+    /**
+     * 根据 contentId + configCode 查询向量列表(含 embedding)
+     */
+    List<ContentVector> selectByContentIdAndConfigCode(@Param("contentId") Long contentId,
+                                                       @Param("configCode") String configCode);
+
+    /**
+     * 根据 contentId 查询向量列表(含 embedding)
+     */
+    List<ContentVector> selectByContentId(@Param("contentId") Long contentId);
+
+    /**
+     * 根据 contentId + sourceField 查询向量
+     */
+    List<ContentVector> selectByContentIdAndField(@Param("contentId") Long contentId,
+                                                  @Param("sourceField") String sourceField);
+
+    /**
+     * 根据 textHash + configCode 查询已缓存的向量
+     */
+    ContentVector selectByTextHashAndConfigCode(@Param("textHash") String textHash,
+                                                @Param("configCode") String configCode);
+
+    /**
+     * 根据 textHash 查询向量(不限 configCode)
+     */
+    ContentVector selectByTextHash(@Param("textHash") String textHash);
+
+    /**
+     * 余弦相似度搜索 Top-N
+     */
+    List<ContentVector> searchTopNByCosine(@Param("configCode") String configCode,
+                                           @Param("queryVector") String queryVector,
+                                           @Param("topN") int topN);
+}

+ 18 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/DeconstructVectorConfigMapperExt.java

@@ -0,0 +1,18 @@
+package com.tzld.videoVector.dao.mapper.pgVector.ext;
+
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * DeconstructVectorConfig 自定义查询 Mapper(与 MBG 生成的基础 Mapper 分离)
+ */
+public interface DeconstructVectorConfigMapperExt {
+
+    /**
+     * 按业务类型和内容类型查询启用的向量配置,支持 null 表示通配所有类型
+     */
+    List<DeconstructVectorConfig> selectMatchingConfigs(
+            @Param("bizType") Short bizType,
+            @Param("contentType") Short contentType);
+}

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

@@ -0,0 +1,75 @@
+package com.tzld.videoVector.dao.mapper.pgVector.ext;
+
+import com.tzld.videoVector.model.po.pgVector.VideoVector;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * VideoVector 自定义向量操作 Mapper(与 MBG 生成的基础 Mapper 分离)
+ */
+public interface VideoVectorMapperExt {
+
+    /**
+     * 插入或更新向量(ON CONFLICT 语义,支持多点模式)
+     * @param videoId    视频ID
+     * @param configCode 配置编码
+     * @param pointIndex 向量点索引(单点模式传0)
+     * @param embedding  向量字符串,格式: "[0.1,0.2,...]"
+     */
+    int upsertVector(@Param("videoId") Long videoId,
+                     @Param("configCode") String configCode,
+                     @Param("pointIndex") int pointIndex,
+                     @Param("embedding") String embedding);
+
+    /**
+     * 判断指定 videoId + configCode 的向量是否存在(任意 pointIndex)
+     */
+    int existsByVideoIdAndConfigCode(@Param("videoId") Long videoId,
+                                     @Param("configCode") String configCode);
+
+    /**
+     * 批量判断 videoIds 在指定 configCode 下是否存在,返回已存在的 videoId 列表(去重)
+     */
+    List<Long> selectExistingVideoIds(@Param("videoIds") List<Long> videoIds,
+                                      @Param("configCode") String configCode);
+
+    /**
+     * 获取指定 videoId + configCode 的向量(以字符串形式返回,取 pointIndex=0)
+     */
+    String selectEmbeddingByVideoIdAndConfigCode(@Param("videoId") Long videoId,
+                                                 @Param("configCode") String configCode);
+
+    /**
+     * 批量获取向量
+     */
+    List<VideoVector> selectVectorsByVideoIds(@Param("videoIds") List<Long> videoIds,
+                                             @Param("configCode") String configCode);
+
+    /**
+     * 获取指定 configCode 下所有 videoId(去重)
+     */
+    List<Long> selectAllVideoIdsByConfigCode(@Param("configCode") String configCode);
+
+    /**
+     * 删除指定 videoId + configCode 的所有向量点
+     */
+    int deleteByVideoIdAndConfigCode(@Param("videoId") Long videoId,
+                                     @Param("configCode") String configCode);
+
+    /**
+     * 批量删除指定 videoIds + configCode 的所有向量点
+     */
+    int deleteBatchByVideoIdsAndConfigCode(@Param("videoIds") List<Long> videoIds,
+                                           @Param("configCode") String configCode);
+
+    /**
+     * 余弦相似度搜索 Top-N
+     * @param configCode  配置编码
+     * @param queryVector 查询向量字符串
+     * @param topN        返回数量
+     * @return VideoVector 列表(包含 videoId、pointIndex 和相似度得分)
+     */
+    List<VideoVector> searchTopNByCosine(@Param("configCode") String configCode,
+                                        @Param("queryVector") String queryVector,
+                                        @Param("topN") int topN);
+}

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

@@ -1,10 +1,10 @@
 package com.tzld.videoVector.job;
 package com.tzld.videoVector.job;
 
 
 import com.tzld.videoVector.common.constant.VectorConstants;
 import com.tzld.videoVector.common.constant.VectorConstants;
-import com.tzld.videoVector.dao.mapper.pgVector.ContentVectorMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.ContentVectorMapperExt;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
-import com.tzld.videoVector.dao.mapper.pgVector.VideoVectorMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.VideoVectorMapperExt;
 import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.MysqlDeconstructContentVectorMapper;
 import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.MysqlDeconstructContentVectorMapper;
 import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.MysqlDeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.MysqlDeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.MysqlDeconstructVectorConfigMapper;
 import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.MysqlDeconstructVectorConfigMapper;
@@ -55,10 +55,10 @@ public class DataMigrationJob {
     private DeconstructVectorConfigMapper pgConfigMapper;
     private DeconstructVectorConfigMapper pgConfigMapper;
 
 
     @Resource
     @Resource
-    private ContentVectorMapper pgContentVectorMapper;
+    private ContentVectorMapperExt pgContentVectorMapper;
 
 
     @Resource
     @Resource
-    private VideoVectorMapper pgVideoVectorMapper;
+    private VideoVectorMapperExt pgVideoVectorMapper;
 
 
     // ==================== Redis ====================
     // ==================== Redis ====================
     @Resource
     @Resource

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

@@ -1,6 +1,6 @@
 package com.tzld.videoVector.service.impl;
 package com.tzld.videoVector.service.impl;
 
 
-import com.tzld.videoVector.dao.mapper.pgVector.VideoVectorMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.VideoVectorMapperExt;
 import com.tzld.videoVector.model.entity.VideoMatch;
 import com.tzld.videoVector.model.entity.VideoMatch;
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
 import com.tzld.videoVector.service.VectorStoreService;
 import com.tzld.videoVector.service.VectorStoreService;
@@ -30,7 +30,7 @@ import java.util.stream.Collectors;
 public class PgVectorStoreServiceImpl implements VectorStoreService {
 public class PgVectorStoreServiceImpl implements VectorStoreService {
 
 
     @Autowired
     @Autowired
-    private VideoVectorMapper videoVectorMapper;
+    private VideoVectorMapperExt videoVectorMapper;
 
 
     // ---------------------------------------------------------------- CRUD
     // ---------------------------------------------------------------- CRUD
 
 

+ 4 - 4
core/src/main/java/com/tzld/videoVector/service/impl/VectorizeServiceImpl.java

@@ -1,8 +1,8 @@
 package com.tzld.videoVector.service.impl;
 package com.tzld.videoVector.service.impl;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
-import com.tzld.videoVector.dao.mapper.pgVector.ContentVectorMapper;
-import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.ContentVectorMapperExt;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.DeconstructVectorConfigMapperExt;
 import com.tzld.videoVector.model.po.pgVector.ContentVector;
 import com.tzld.videoVector.model.po.pgVector.ContentVector;
 import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
 import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
 import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
 import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
@@ -28,10 +28,10 @@ import java.util.List;
 public class VectorizeServiceImpl implements VectorizeService {
 public class VectorizeServiceImpl implements VectorizeService {
 
 
     @Resource
     @Resource
-    private DeconstructVectorConfigMapper vectorConfigMapper;
+    private DeconstructVectorConfigMapperExt vectorConfigMapper;
 
 
     @Resource
     @Resource
-    private ContentVectorMapper pgContentVectorMapper;
+    private ContentVectorMapperExt pgContentVectorMapper;
 
 
     @Resource
     @Resource
     private EmbeddingService embeddingService;
     private EmbeddingService embeddingService;

+ 2 - 2
core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java

@@ -2,7 +2,7 @@ package com.tzld.videoVector.service.impl;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.videoVector.api.VideoApiService;
 import com.tzld.videoVector.api.VideoApiService;
-import com.tzld.videoVector.dao.mapper.pgVector.ContentVectorMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.ContentVectorMapperExt;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.model.entity.DeconstructResult;
 import com.tzld.videoVector.model.entity.DeconstructResult;
@@ -49,7 +49,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     private DeconstructContentMapper deconstructContentMapper;
     private DeconstructContentMapper deconstructContentMapper;
 
 
     @Resource
     @Resource
-    private ContentVectorMapper pgContentVectorMapper;
+    private ContentVectorMapperExt pgContentVectorMapper;
 
 
     @Resource
     @Resource
     private VectorizeService vectorizeService;
     private VectorizeService vectorizeService;

+ 0 - 101
core/src/main/resources/mapper/pgVector/ContentVectorMapper.xml

@@ -405,105 +405,4 @@
     where id = #{id,jdbcType=BIGINT}
     where id = #{id,jdbcType=BIGINT}
   </update>
   </update>
 
 
-  <!-- ==================== 自定义向量操作 SQL ==================== -->
-
-  <resultMap id="VectorWithEmbeddingResultMap" type="com.tzld.videoVector.model.po.pgVector.ContentVector">
-    <id column="id" jdbcType="BIGINT" property="id" />
-    <result column="content_id" jdbcType="BIGINT" property="contentId" />
-    <result column="task_id" jdbcType="VARCHAR" property="taskId" />
-    <result column="config_code" jdbcType="VARCHAR" property="configCode" />
-    <result column="source_field" jdbcType="VARCHAR" property="sourceField" />
-    <result column="source_path" jdbcType="VARCHAR" property="sourcePath" />
-    <result column="text_hash" jdbcType="VARCHAR" property="textHash" />
-    <result column="embedding_model" jdbcType="VARCHAR" property="embeddingModel" />
-    <result column="segment_index" jdbcType="INTEGER" property="segmentIndex" />
-    <result column="segment_total" jdbcType="INTEGER" property="segmentTotal" />
-    <result column="source_text" jdbcType="VARCHAR" property="sourceText" />
-    <result column="embedding" jdbcType="VARCHAR" property="embedding" />
-    <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
-    <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
-  </resultMap>
-
-  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.ContentVector">
-    <result column="id" jdbcType="BIGINT" property="id" />
-    <result column="content_id" jdbcType="BIGINT" property="contentId" />
-    <result column="config_code" jdbcType="VARCHAR" property="configCode" />
-    <result column="score" jdbcType="DOUBLE" property="score" />
-  </resultMap>
-
-  <!-- Upsert: 插入或更新向量 -->
-  <insert id="upsertWithEmbedding">
-    INSERT INTO content_vectors (content_id, task_id, config_code, source_field, source_path,
-      text_hash, embedding_model, segment_index, segment_total, source_text, embedding, created_at, updated_at)
-    VALUES (#{contentId}, #{taskId}, #{configCode}, #{sourceField}, #{sourcePath},
-      #{textHash}, #{embeddingModel}, #{segmentIndex}, #{segmentTotal}, #{sourceText},
-      #{embedding}::vector, NOW(), NOW())
-    ON CONFLICT (content_id, config_code, text_hash, segment_index)
-    DO UPDATE SET embedding = EXCLUDED.embedding, source_text = EXCLUDED.source_text, updated_at = NOW()
-  </insert>
-
-  <!-- 根据 contentId + configCode 查询 -->
-  <select id="selectByContentIdAndConfigCode" resultMap="VectorWithEmbeddingResultMap">
-    SELECT id, content_id, task_id, config_code, source_field, source_path,
-      text_hash, embedding_model, segment_index, segment_total, source_text,
-      embedding::text as embedding, created_at, updated_at
-    FROM content_vectors
-    WHERE content_id = #{contentId}
-    <if test="configCode != null and configCode != ''">
-      AND config_code = #{configCode}
-    </if>
-    ORDER BY source_field ASC, segment_index ASC
-  </select>
-
-  <!-- 根据 contentId 查询 -->
-  <select id="selectByContentId" resultMap="VectorWithEmbeddingResultMap">
-    SELECT id, content_id, task_id, config_code, source_field, source_path,
-      text_hash, embedding_model, segment_index, segment_total, source_text,
-      embedding::text as embedding, created_at, updated_at
-    FROM content_vectors
-    WHERE content_id = #{contentId}
-    ORDER BY source_field ASC, segment_index ASC
-  </select>
-
-  <!-- 根据 contentId + sourceField 查询 -->
-  <select id="selectByContentIdAndField" resultMap="VectorWithEmbeddingResultMap">
-    SELECT id, content_id, task_id, config_code, source_field, source_path,
-      text_hash, embedding_model, segment_index, segment_total, source_text,
-      embedding::text as embedding, created_at, updated_at
-    FROM content_vectors
-    WHERE content_id = #{contentId} AND source_field = #{sourceField}
-    ORDER BY segment_index ASC
-  </select>
-
-  <!-- 根据 textHash + configCode 查询缓存向量 -->
-  <select id="selectByTextHashAndConfigCode" resultMap="VectorWithEmbeddingResultMap">
-    SELECT id, content_id, task_id, config_code, source_field, source_path,
-      text_hash, embedding_model, segment_index, segment_total, source_text,
-      embedding::text as embedding, created_at, updated_at
-    FROM content_vectors
-    WHERE text_hash = #{textHash} AND config_code = #{configCode}
-    ORDER BY id DESC
-    LIMIT 1
-  </select>
-
-  <!-- 根据 textHash 查询(不限 configCode) -->
-  <select id="selectByTextHash" resultMap="VectorWithEmbeddingResultMap">
-    SELECT id, content_id, task_id, config_code, source_field, source_path,
-      text_hash, embedding_model, segment_index, segment_total, source_text,
-      embedding::text as embedding, created_at, updated_at
-    FROM content_vectors
-    WHERE text_hash = #{textHash}
-    ORDER BY id DESC
-    LIMIT 1
-  </select>
-
-  <!-- 余弦相似度搜索 Top-N -->
-  <select id="searchTopNByCosine" resultMap="SearchResultMap">
-    SELECT id, content_id, config_code, 1 - (embedding &lt;=&gt; #{queryVector}::vector) AS score
-    FROM content_vectors
-    WHERE config_code = #{configCode}
-    ORDER BY embedding &lt;=&gt; #{queryVector}::vector
-    LIMIT #{topN}
-  </select>
-
 </mapper>
 </mapper>

+ 0 - 14
core/src/main/resources/mapper/pgVector/DeconstructVectorConfigMapper.xml

@@ -468,18 +468,4 @@
     where id = #{id,jdbcType=BIGINT}
     where id = #{id,jdbcType=BIGINT}
   </update>
   </update>
 
 
-  <!-- 自定义:按业务类型和内容类型查询启用的向量配置 -->
-  <select id="selectMatchingConfigs" resultMap="BaseResultMap">
-    SELECT
-    <include refid="Base_Column_List" />
-    FROM deconstruct_vector_config
-    WHERE enabled = 1
-    <if test="bizType != null">
-      AND (biz_type IS NULL OR biz_type = #{bizType,jdbcType=SMALLINT})
-    </if>
-    <if test="contentType != null">
-      AND (content_type IS NULL OR content_type = #{contentType,jdbcType=SMALLINT})
-    </if>
-    ORDER BY priority ASC
-  </select>
 </mapper>
 </mapper>

+ 0 - 90
core/src/main/resources/mapper/pgVector/VideoVectorMapper.xml

@@ -293,94 +293,4 @@
     where id = #{id,jdbcType=BIGINT}
     where id = #{id,jdbcType=BIGINT}
   </update>
   </update>
 
 
-  <!-- ==================== 自定义向量操作 SQL ==================== -->
-
-  <!-- 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())
-    ON CONFLICT (config_code, video_id, point_index)
-    DO UPDATE SET embedding = EXCLUDED.embedding, updated_at = NOW()
-  </insert>
-
-  <!-- 判断是否存在(任意 pointIndex) -->
-  <select id="existsByVideoIdAndConfigCode" resultType="int">
-    SELECT COUNT(1) FROM video_vectors
-    WHERE video_id = #{videoId} AND config_code = #{configCode}
-  </select>
-
-  <!-- 批量查询已存在的 videoId(去重) -->
-  <select id="selectExistingVideoIds" resultType="java.lang.Long">
-    SELECT DISTINCT video_id FROM video_vectors
-    WHERE config_code = #{configCode}
-    AND video_id IN
-    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
-      #{vid}
-    </foreach>
-  </select>
-
-  <!-- 获取单个向量(取 pointIndex=0) -->
-  <select id="selectEmbeddingByVideoIdAndConfigCode" resultType="java.lang.String">
-    SELECT embedding::text FROM video_vectors
-    WHERE video_id = #{videoId} AND config_code = #{configCode} AND point_index = 0
-  </select>
-
-  <!-- 批量获取向量 -->
-  <resultMap id="VectorWithEmbeddingResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
-    <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="point_index" jdbcType="INTEGER" property="pointIndex" />
-    <result column="embedding" jdbcType="VARCHAR" property="embedding" />
-    <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
-    <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
-  </resultMap>
-
-  <select id="selectVectorsByVideoIds" resultMap="VectorWithEmbeddingResultMap">
-    SELECT id, video_id, config_code, point_index, embedding::text as embedding, created_at, updated_at
-    FROM video_vectors
-    WHERE config_code = #{configCode}
-    AND video_id IN
-    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
-      #{vid}
-    </foreach>
-  </select>
-
-  <!-- 获取指定 configCode 下所有 videoId(去重) -->
-  <select id="selectAllVideoIdsByConfigCode" resultType="java.lang.Long">
-    SELECT DISTINCT video_id FROM video_vectors
-    WHERE config_code = #{configCode}
-  </select>
-
-  <!-- 删除单个视频的所有向量点 -->
-  <delete id="deleteByVideoIdAndConfigCode">
-    DELETE FROM video_vectors
-    WHERE video_id = #{videoId} AND config_code = #{configCode}
-  </delete>
-
-  <!-- 批量删除向量 -->
-  <delete id="deleteBatchByVideoIdsAndConfigCode">
-    DELETE FROM video_vectors
-    WHERE config_code = #{configCode}
-    AND video_id IN
-    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
-      #{vid}
-    </foreach>
-  </delete>
-
-  <!-- 余弦相似度搜索 Top-N(返回 videoId + pointIndex + score) -->
-  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
-    <result column="video_id" jdbcType="BIGINT" property="videoId" />
-    <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
-    <result column="score" jdbcType="DOUBLE" property="score" />
-  </resultMap>
-
-  <select id="searchTopNByCosine" resultMap="SearchResultMap">
-    SELECT video_id, point_index, 1 - (embedding &lt;=&gt; #{queryVector}::vector) AS score
-    FROM video_vectors
-    WHERE config_code = #{configCode}
-    ORDER BY embedding &lt;=&gt; #{queryVector}::vector
-    LIMIT #{topN}
-  </select>
-
 </mapper>
 </mapper>

+ 108 - 0
core/src/main/resources/mapper/pgVector/ext/ContentVectorMapperExt.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.videoVector.dao.mapper.pgVector.ext.ContentVectorMapperExt">
+
+  <!-- ==================== 自定义 ResultMap ==================== -->
+
+  <resultMap id="VectorWithEmbeddingResultMap" type="com.tzld.videoVector.model.po.pgVector.ContentVector">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="content_id" jdbcType="BIGINT" property="contentId" />
+    <result column="task_id" jdbcType="VARCHAR" property="taskId" />
+    <result column="config_code" jdbcType="VARCHAR" property="configCode" />
+    <result column="source_field" jdbcType="VARCHAR" property="sourceField" />
+    <result column="source_path" jdbcType="VARCHAR" property="sourcePath" />
+    <result column="text_hash" jdbcType="VARCHAR" property="textHash" />
+    <result column="embedding_model" jdbcType="VARCHAR" property="embeddingModel" />
+    <result column="segment_index" jdbcType="INTEGER" property="segmentIndex" />
+    <result column="segment_total" jdbcType="INTEGER" property="segmentTotal" />
+    <result column="source_text" jdbcType="VARCHAR" property="sourceText" />
+    <result column="embedding" jdbcType="VARCHAR" property="embedding" />
+    <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
+    <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
+  </resultMap>
+
+  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.ContentVector">
+    <result column="id" jdbcType="BIGINT" property="id" />
+    <result column="content_id" jdbcType="BIGINT" property="contentId" />
+    <result column="config_code" jdbcType="VARCHAR" property="configCode" />
+    <result column="score" jdbcType="DOUBLE" property="score" />
+  </resultMap>
+
+  <!-- ==================== 自定义向量操作 SQL ==================== -->
+
+  <!-- Upsert: 插入或更新向量 -->
+  <insert id="upsertWithEmbedding">
+    INSERT INTO content_vectors (content_id, task_id, config_code, source_field, source_path,
+      text_hash, embedding_model, segment_index, segment_total, source_text, embedding, created_at, updated_at)
+    VALUES (#{contentId}, #{taskId}, #{configCode}, #{sourceField}, #{sourcePath},
+      #{textHash}, #{embeddingModel}, #{segmentIndex}, #{segmentTotal}, #{sourceText},
+      #{embedding}::vector, NOW(), NOW())
+    ON CONFLICT (content_id, config_code, text_hash, segment_index)
+    DO UPDATE SET embedding = EXCLUDED.embedding, source_text = EXCLUDED.source_text, updated_at = NOW()
+  </insert>
+
+  <!-- 根据 contentId + configCode 查询 -->
+  <select id="selectByContentIdAndConfigCode" resultMap="VectorWithEmbeddingResultMap">
+    SELECT id, content_id, task_id, config_code, source_field, source_path,
+      text_hash, embedding_model, segment_index, segment_total, source_text,
+      embedding::text as embedding, created_at, updated_at
+    FROM content_vectors
+    WHERE content_id = #{contentId}
+    <if test="configCode != null and configCode != ''">
+      AND config_code = #{configCode}
+    </if>
+    ORDER BY source_field ASC, segment_index ASC
+  </select>
+
+  <!-- 根据 contentId 查询 -->
+  <select id="selectByContentId" resultMap="VectorWithEmbeddingResultMap">
+    SELECT id, content_id, task_id, config_code, source_field, source_path,
+      text_hash, embedding_model, segment_index, segment_total, source_text,
+      embedding::text as embedding, created_at, updated_at
+    FROM content_vectors
+    WHERE content_id = #{contentId}
+    ORDER BY source_field ASC, segment_index ASC
+  </select>
+
+  <!-- 根据 contentId + sourceField 查询 -->
+  <select id="selectByContentIdAndField" resultMap="VectorWithEmbeddingResultMap">
+    SELECT id, content_id, task_id, config_code, source_field, source_path,
+      text_hash, embedding_model, segment_index, segment_total, source_text,
+      embedding::text as embedding, created_at, updated_at
+    FROM content_vectors
+    WHERE content_id = #{contentId} AND source_field = #{sourceField}
+    ORDER BY segment_index ASC
+  </select>
+
+  <!-- 根据 textHash + configCode 查询缓存向量 -->
+  <select id="selectByTextHashAndConfigCode" resultMap="VectorWithEmbeddingResultMap">
+    SELECT id, content_id, task_id, config_code, source_field, source_path,
+      text_hash, embedding_model, segment_index, segment_total, source_text,
+      embedding::text as embedding, created_at, updated_at
+    FROM content_vectors
+    WHERE text_hash = #{textHash} AND config_code = #{configCode}
+    ORDER BY id DESC
+    LIMIT 1
+  </select>
+
+  <!-- 根据 textHash 查询(不限 configCode) -->
+  <select id="selectByTextHash" resultMap="VectorWithEmbeddingResultMap">
+    SELECT id, content_id, task_id, config_code, source_field, source_path,
+      text_hash, embedding_model, segment_index, segment_total, source_text,
+      embedding::text as embedding, created_at, updated_at
+    FROM content_vectors
+    WHERE text_hash = #{textHash}
+    ORDER BY id DESC
+    LIMIT 1
+  </select>
+
+  <!-- 余弦相似度搜索 Top-N -->
+  <select id="searchTopNByCosine" resultMap="SearchResultMap">
+    SELECT id, content_id, config_code, 1 - (embedding &lt;=&gt; #{queryVector}::vector) AS score
+    FROM content_vectors
+    WHERE config_code = #{configCode}
+    ORDER BY embedding &lt;=&gt; #{queryVector}::vector
+    LIMIT #{topN}
+  </select>
+
+</mapper>

+ 26 - 0
core/src/main/resources/mapper/pgVector/ext/DeconstructVectorConfigMapperExt.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.videoVector.dao.mapper.pgVector.ext.DeconstructVectorConfigMapperExt">
+
+  <sql id="Base_Column_List">
+    id, config_code, config_name, biz_type, content_type, source_field, source_path, extract_rule,
+    embedding_model, dimension, max_length, enable_segment, segment_size, priority, enabled,
+    create_time, update_time
+  </sql>
+
+  <!-- 自定义:按业务类型和内容类型查询启用的向量配置 -->
+  <select id="selectMatchingConfigs" resultMap="com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper.BaseResultMap">
+    SELECT
+    <include refid="Base_Column_List" />
+    FROM deconstruct_vector_config
+    WHERE enabled = 1
+    <if test="bizType != null">
+      AND (biz_type IS NULL OR biz_type = #{bizType,jdbcType=SMALLINT})
+    </if>
+    <if test="contentType != null">
+      AND (content_type IS NULL OR content_type = #{contentType,jdbcType=SMALLINT})
+    </if>
+    ORDER BY priority ASC
+  </select>
+
+</mapper>

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

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.videoVector.dao.mapper.pgVector.ext.VideoVectorMapperExt">
+
+  <!-- ==================== 自定义 ResultMap ==================== -->
+
+  <!-- 批量获取向量 -->
+  <resultMap id="VectorWithEmbeddingResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
+    <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="point_index" jdbcType="INTEGER" property="pointIndex" />
+    <result column="embedding" jdbcType="VARCHAR" property="embedding" />
+    <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
+    <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
+  </resultMap>
+
+  <!-- 余弦相似度搜索 Top-N(返回 videoId + pointIndex + score) -->
+  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
+    <result column="video_id" jdbcType="BIGINT" property="videoId" />
+    <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
+    <result column="score" jdbcType="DOUBLE" property="score" />
+  </resultMap>
+
+  <!-- ==================== 自定义向量操作 SQL ==================== -->
+
+  <!-- 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())
+    ON CONFLICT (config_code, video_id, point_index)
+    DO UPDATE SET embedding = EXCLUDED.embedding, updated_at = NOW()
+  </insert>
+
+  <!-- 判断是否存在(任意 pointIndex) -->
+  <select id="existsByVideoIdAndConfigCode" resultType="int">
+    SELECT COUNT(1) FROM video_vectors
+    WHERE video_id = #{videoId} AND config_code = #{configCode}
+  </select>
+
+  <!-- 批量查询已存在的 videoId(去重) -->
+  <select id="selectExistingVideoIds" resultType="java.lang.Long">
+    SELECT DISTINCT video_id FROM video_vectors
+    WHERE config_code = #{configCode}
+    AND video_id IN
+    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
+      #{vid}
+    </foreach>
+  </select>
+
+  <!-- 获取单个向量(取 pointIndex=0) -->
+  <select id="selectEmbeddingByVideoIdAndConfigCode" resultType="java.lang.String">
+    SELECT embedding::text FROM video_vectors
+    WHERE video_id = #{videoId} AND config_code = #{configCode} AND point_index = 0
+  </select>
+
+  <select id="selectVectorsByVideoIds" resultMap="VectorWithEmbeddingResultMap">
+    SELECT id, video_id, config_code, point_index, embedding::text as embedding, created_at, updated_at
+    FROM video_vectors
+    WHERE config_code = #{configCode}
+    AND video_id IN
+    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
+      #{vid}
+    </foreach>
+  </select>
+
+  <!-- 获取指定 configCode 下所有 videoId(去重) -->
+  <select id="selectAllVideoIdsByConfigCode" resultType="java.lang.Long">
+    SELECT DISTINCT video_id FROM video_vectors
+    WHERE config_code = #{configCode}
+  </select>
+
+  <!-- 删除单个视频的所有向量点 -->
+  <delete id="deleteByVideoIdAndConfigCode">
+    DELETE FROM video_vectors
+    WHERE video_id = #{videoId} AND config_code = #{configCode}
+  </delete>
+
+  <!-- 批量删除向量 -->
+  <delete id="deleteBatchByVideoIdsAndConfigCode">
+    DELETE FROM video_vectors
+    WHERE config_code = #{configCode}
+    AND video_id IN
+    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
+      #{vid}
+    </foreach>
+  </delete>
+
+  <select id="searchTopNByCosine" resultMap="SearchResultMap">
+    SELECT video_id, point_index, 1 - (embedding &lt;=&gt; #{queryVector}::vector) AS score
+    FROM video_vectors
+    WHERE config_code = #{configCode}
+    ORDER BY embedding &lt;=&gt; #{queryVector}::vector
+    LIMIT #{topN}
+  </select>
+
+</mapper>