Forráskód Böngészése

接入pgvector素材向量化

wangyunpeng 1 hete
szülő
commit
a9de2cf2a6
25 módosított fájl, 8445 hozzáadás és 104 törlés
  1. 148 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ContentVectorMapper.java
  2. 96 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/DeconstructContentMapper.java
  3. 103 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/DeconstructVectorConfigMapper.java
  4. 65 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/VideoVectorMapper.java
  5. 12 12
      core/src/main/java/com/tzld/videoVector/job/VideoVectorJob.java
  6. 495 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/ContentVector.java
  7. 1153 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/ContentVectorExample.java
  8. 712 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructContent.java
  9. 1573 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructContentExample.java
  10. 640 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructVectorConfig.java
  11. 1383 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructVectorConfigExample.java
  12. 27 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/VideoVector.java
  13. 1 1
      core/src/main/java/com/tzld/videoVector/service/EmbeddingService.java
  14. 1 1
      core/src/main/java/com/tzld/videoVector/service/VectorStoreService.java
  15. 2 2
      core/src/main/java/com/tzld/videoVector/service/VectorizeService.java
  16. 1 1
      core/src/main/java/com/tzld/videoVector/service/impl/EmbeddingServiceImpl.java
  17. 271 0
      core/src/main/java/com/tzld/videoVector/service/impl/PgVectorStoreServiceImpl.java
  18. 5 5
      core/src/main/java/com/tzld/videoVector/service/impl/RedisVectorStoreServiceImpl.java
  19. 96 42
      core/src/main/java/com/tzld/videoVector/service/impl/VectorizeServiceImpl.java
  20. 55 36
      core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java
  21. 21 4
      core/src/main/resources/generator/mybatis-pgvector-generator-config.xml
  22. 509 0
      core/src/main/resources/mapper/pgVector/ContentVectorMapper.xml
  23. 502 0
      core/src/main/resources/mapper/pgVector/DeconstructContentMapper.xml
  24. 485 0
      core/src/main/resources/mapper/pgVector/DeconstructVectorConfigMapper.xml
  25. 89 0
      core/src/main/resources/mapper/pgVector/VideoVectorMapper.xml

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

@@ -0,0 +1,148 @@
+package com.tzld.videoVector.dao.mapper.pgVector;
+
+import com.tzld.videoVector.model.po.pgVector.ContentVector;
+import com.tzld.videoVector.model.po.pgVector.ContentVectorExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface ContentVectorMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    long countByExample(ContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int deleteByExample(ContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int insert(ContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int insertSelective(ContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    List<ContentVector> selectByExample(ContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    ContentVector selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int updateByExampleSelective(@Param("record") ContentVector record, @Param("example") ContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int updateByExample(@Param("record") ContentVector record, @Param("example") ContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    int updateByPrimaryKeySelective(ContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    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);
+}

+ 96 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/DeconstructContentMapper.java

@@ -0,0 +1,96 @@
+package com.tzld.videoVector.dao.mapper.pgVector;
+
+import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContentExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DeconstructContentMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    long countByExample(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int deleteByExample(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int insert(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int insertSelective(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    List<DeconstructContent> selectByExample(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    DeconstructContent selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByExampleSelective(@Param("record") DeconstructContent record, @Param("example") DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByExample(@Param("record") DeconstructContent record, @Param("example") DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByPrimaryKeySelective(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByPrimaryKey(DeconstructContent record);
+}

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

@@ -0,0 +1,103 @@
+package com.tzld.videoVector.dao.mapper.pgVector;
+
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DeconstructVectorConfigMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    long countByExample(DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int deleteByExample(DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int insert(DeconstructVectorConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int insertSelective(DeconstructVectorConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    List<DeconstructVectorConfig> selectByExample(DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    DeconstructVectorConfig selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByExampleSelective(@Param("record") DeconstructVectorConfig record, @Param("example") DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByExample(@Param("record") DeconstructVectorConfig record, @Param("example") DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByPrimaryKeySelective(DeconstructVectorConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    int updateByPrimaryKey(DeconstructVectorConfig record);
+
+    /**
+     * 按业务类型和内容类型查询启用的向量配置,支持 null 表示通配所有类型
+     */
+    List<DeconstructVectorConfig> selectMatchingConfigs(
+            @Param("bizType") Short bizType,
+            @Param("contentType") Short contentType);
+}

+ 65 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/VideoVectorMapper.java

@@ -3,6 +3,7 @@ package com.tzld.videoVector.dao.mapper.pgVector;
 import com.tzld.videoVector.model.po.pgVector.VideoVector;
 import com.tzld.videoVector.model.po.pgVector.VideoVectorExample;
 import java.util.List;
+import java.util.Set;
 import org.apache.ibatis.annotations.Param;
 
 public interface VideoVectorMapper {
@@ -93,4 +94,68 @@ public interface VideoVectorMapper {
      * @mbg.generated Wed Apr 29 15:13:43 CST 2026
      */
     int updateByPrimaryKey(VideoVector record);
+
+    // ==================== 自定义向量操作方法 ====================
+
+    /**
+     * 插入或更新向量(ON CONFLICT 语义)
+     * @param videoId    视频ID
+     * @param configCode 配置编码
+     * @param embedding  向量字符串,格式: "[0.1,0.2,...]"
+     */
+    int upsertVector(@Param("videoId") Long videoId,
+                     @Param("configCode") String configCode,
+                     @Param("embedding") String embedding);
+
+    /**
+     * 判断指定 videoId + configCode 的向量是否存在
+     */
+    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 的向量(以字符串形式返回)
+     */
+    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 和相似度得分)
+     */
+    List<VideoVector> searchTopNByCosine(@Param("configCode") String configCode,
+                                        @Param("queryVector") String queryVector,
+                                        @Param("topN") int topN);
 }

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

@@ -5,13 +5,13 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.odps.data.Record;
 import com.google.common.collect.Lists;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentMapper;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructVectorConfigMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.model.entity.DeconstructResult;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContentExample;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample;
 import com.tzld.videoVector.api.AigcApiService;
 import com.tzld.videoVector.api.VideoApiService;
 import com.tzld.videoVector.service.DeconstructService;
@@ -196,7 +196,7 @@ public class VideoVectorJob {
      */
     private List<DeconstructVectorConfig> getEnabledConfigs() {
         DeconstructVectorConfigExample example = new DeconstructVectorConfigExample();
-        example.createCriteria().andEnabledEqualTo((byte) 1);
+        example.createCriteria().andEnabledEqualTo((short) 1);
         example.setOrderByClause("priority ASC");
         return vectorConfigMapper.selectByExample(example);
     }
@@ -798,7 +798,7 @@ public class VideoVectorJob {
             Date timeoutThreshold = new Date(System.currentTimeMillis() - VectorConstants.TIMEOUT_MS);
 
             DeconstructContentExample example = new DeconstructContentExample();
-            example.createCriteria().andStatusIn(Arrays.asList((byte) 0, (byte) 1))  // PENDING=0, RUNNING=1
+            example.createCriteria().andStatusIn(Arrays.asList((short) 0, (short) 1))  // PENDING=0, RUNNING=1
                     .andCreateTimeLessThanOrEqualTo(timeoutThreshold);
             List<DeconstructContent> timeoutTasks = deconstructContentMapper.selectByExample(example);
 
@@ -832,7 +832,7 @@ public class VideoVectorJob {
                     if (result.isFinished()) {
                         if (result.isSuccess()) {
                             // 成功
-                            content.setStatus((byte) 2);
+                            content.setStatus((short) 2);
                             content.setResultJson(result.getResult());
                             content.setPointUrl(result.getPointUrl());
                             content.setWeightUrl(result.getWeightUrl());
@@ -843,13 +843,13 @@ public class VideoVectorJob {
                             log.info("重试解构任务成功,taskId={}", taskId);
                         } else {
                             // 失败
-                            updateContentStatus(content, (byte) 3, result.getReason());
+                            updateContentStatus(content, (short) 3, result.getReason());
                             failCount++;
                             log.warn("重试解构任务失败,taskId={}, reason={}", taskId, result.getReason());
                         }
                     } else {
                         // 仍在处理中,更新状态
-                        content.setStatus(result.getStatus().byteValue());
+                        content.setStatus(result.getStatus().shortValue());
                         content.setUpdateTime(new Date());
                         deconstructContentMapper.updateByPrimaryKeySelective(content);
                         log.info("解构任务仍在处理中,taskId={}, status={}", taskId, result.getStatusDesc());
@@ -969,7 +969,7 @@ public class VideoVectorJob {
     /**
      * 更新内容状态为失败
      */
-    private void updateContentStatus(DeconstructContent content, byte status, String reason) {
+    private void updateContentStatus(DeconstructContent content, short status, String reason) {
         content.setStatus(status);
         content.setFailureReason(reason);
         content.setUpdateTime(new Date());

+ 495 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/ContentVector.java

@@ -0,0 +1,495 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.Date;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table content_vectors
+ */
+public class ContentVector {
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private Long id;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.content_id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private Long contentId;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.task_id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String taskId;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.config_code
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String configCode;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.source_field
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String sourceField;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.source_path
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String sourcePath;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.text_hash
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String textHash;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.embedding_model
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String embeddingModel;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.segment_index
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private Integer segmentIndex;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.segment_total
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private Integer segmentTotal;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.source_text
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    private String sourceText;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.created_at
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    private Date createdAt;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column content_vectors.updated_at
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    private Date updatedAt;
+
+    /**
+     * embedding 向量字段(vector(1024)类型,以字符串形式传递)
+     * 格式示例: "[0.1,0.2,...]"
+     */
+    private String embedding;
+
+    public String getEmbedding() {
+        return embedding;
+    }
+
+    public void setEmbedding(String embedding) {
+        this.embedding = embedding;
+    }
+
+    /**
+     * 余弦相似度得分(仅搜索时使用,非持久化字段)
+     */
+    private Double score;
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.id
+     *
+     * @return the value of content_vectors.id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.id
+     *
+     * @param id the value for content_vectors.id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.content_id
+     *
+     * @return the value of content_vectors.content_id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public Long getContentId() {
+        return contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.content_id
+     *
+     * @param contentId the value for content_vectors.content_id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setContentId(Long contentId) {
+        this.contentId = contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.task_id
+     *
+     * @return the value of content_vectors.task_id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getTaskId() {
+        return taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.task_id
+     *
+     * @param taskId the value for content_vectors.task_id
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.config_code
+     *
+     * @return the value of content_vectors.config_code
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getConfigCode() {
+        return configCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.config_code
+     *
+     * @param configCode the value for content_vectors.config_code
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setConfigCode(String configCode) {
+        this.configCode = configCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.source_field
+     *
+     * @return the value of content_vectors.source_field
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getSourceField() {
+        return sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.source_field
+     *
+     * @param sourceField the value for content_vectors.source_field
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setSourceField(String sourceField) {
+        this.sourceField = sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.source_path
+     *
+     * @return the value of content_vectors.source_path
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getSourcePath() {
+        return sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.source_path
+     *
+     * @param sourcePath the value for content_vectors.source_path
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setSourcePath(String sourcePath) {
+        this.sourcePath = sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.text_hash
+     *
+     * @return the value of content_vectors.text_hash
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getTextHash() {
+        return textHash;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.text_hash
+     *
+     * @param textHash the value for content_vectors.text_hash
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setTextHash(String textHash) {
+        this.textHash = textHash;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.embedding_model
+     *
+     * @return the value of content_vectors.embedding_model
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getEmbeddingModel() {
+        return embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.embedding_model
+     *
+     * @param embeddingModel the value for content_vectors.embedding_model
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setEmbeddingModel(String embeddingModel) {
+        this.embeddingModel = embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.segment_index
+     *
+     * @return the value of content_vectors.segment_index
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public Integer getSegmentIndex() {
+        return segmentIndex;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.segment_index
+     *
+     * @param segmentIndex the value for content_vectors.segment_index
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setSegmentIndex(Integer segmentIndex) {
+        this.segmentIndex = segmentIndex;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.segment_total
+     *
+     * @return the value of content_vectors.segment_total
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public Integer getSegmentTotal() {
+        return segmentTotal;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.segment_total
+     *
+     * @param segmentTotal the value for content_vectors.segment_total
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setSegmentTotal(Integer segmentTotal) {
+        this.segmentTotal = segmentTotal;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.source_text
+     *
+     * @return the value of content_vectors.source_text
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    public String getSourceText() {
+        return sourceText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.source_text
+     *
+     * @param sourceText the value for content_vectors.source_text
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    public void setSourceText(String sourceText) {
+        this.sourceText = sourceText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.created_at
+     *
+     * @return the value of content_vectors.created_at
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.created_at
+     *
+     * @param createdAt the value for content_vectors.created_at
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column content_vectors.updated_at
+     *
+     * @return the value of content_vectors.updated_at
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    public Date getUpdatedAt() {
+        return updatedAt;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column content_vectors.updated_at
+     *
+     * @param updatedAt the value for content_vectors.updated_at
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    public void setUpdatedAt(Date updatedAt) {
+        this.updatedAt = updatedAt;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:37 CST 2026
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", contentId=").append(contentId);
+        sb.append(", taskId=").append(taskId);
+        sb.append(", configCode=").append(configCode);
+        sb.append(", sourceField=").append(sourceField);
+        sb.append(", sourcePath=").append(sourcePath);
+        sb.append(", textHash=").append(textHash);
+        sb.append(", embeddingModel=").append(embeddingModel);
+        sb.append(", segmentIndex=").append(segmentIndex);
+        sb.append(", segmentTotal=").append(segmentTotal);
+        sb.append(", sourceText=").append(sourceText);
+        sb.append(", createdAt=").append(createdAt);
+        sb.append(", updatedAt=").append(updatedAt);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1153 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/ContentVectorExample.java

@@ -0,0 +1,1153 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ContentVectorExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public ContentVectorExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdIsNull() {
+            addCriterion("content_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdIsNotNull() {
+            addCriterion("content_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdEqualTo(Long value) {
+            addCriterion("content_id =", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdNotEqualTo(Long value) {
+            addCriterion("content_id <>", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdGreaterThan(Long value) {
+            addCriterion("content_id >", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("content_id >=", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdLessThan(Long value) {
+            addCriterion("content_id <", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdLessThanOrEqualTo(Long value) {
+            addCriterion("content_id <=", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdIn(List<Long> values) {
+            addCriterion("content_id in", values, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdNotIn(List<Long> values) {
+            addCriterion("content_id not in", values, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdBetween(Long value1, Long value2) {
+            addCriterion("content_id between", value1, value2, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdNotBetween(Long value1, Long value2) {
+            addCriterion("content_id not between", value1, value2, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIsNull() {
+            addCriterion("task_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIsNotNull() {
+            addCriterion("task_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdEqualTo(String value) {
+            addCriterion("task_id =", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotEqualTo(String value) {
+            addCriterion("task_id <>", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThan(String value) {
+            addCriterion("task_id >", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThanOrEqualTo(String value) {
+            addCriterion("task_id >=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThan(String value) {
+            addCriterion("task_id <", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThanOrEqualTo(String value) {
+            addCriterion("task_id <=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLike(String value) {
+            addCriterion("task_id like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotLike(String value) {
+            addCriterion("task_id not like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIn(List<String> values) {
+            addCriterion("task_id in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotIn(List<String> values) {
+            addCriterion("task_id not in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdBetween(String value1, String value2) {
+            addCriterion("task_id between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotBetween(String value1, String value2) {
+            addCriterion("task_id not between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIsNull() {
+            addCriterion("config_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIsNotNull() {
+            addCriterion("config_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeEqualTo(String value) {
+            addCriterion("config_code =", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotEqualTo(String value) {
+            addCriterion("config_code <>", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeGreaterThan(String value) {
+            addCriterion("config_code >", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("config_code >=", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLessThan(String value) {
+            addCriterion("config_code <", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLessThanOrEqualTo(String value) {
+            addCriterion("config_code <=", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLike(String value) {
+            addCriterion("config_code like", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotLike(String value) {
+            addCriterion("config_code not like", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIn(List<String> values) {
+            addCriterion("config_code in", values, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotIn(List<String> values) {
+            addCriterion("config_code not in", values, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeBetween(String value1, String value2) {
+            addCriterion("config_code between", value1, value2, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotBetween(String value1, String value2) {
+            addCriterion("config_code not between", value1, value2, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNull() {
+            addCriterion("source_field is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNotNull() {
+            addCriterion("source_field is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldEqualTo(String value) {
+            addCriterion("source_field =", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotEqualTo(String value) {
+            addCriterion("source_field <>", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThan(String value) {
+            addCriterion("source_field >", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThanOrEqualTo(String value) {
+            addCriterion("source_field >=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThan(String value) {
+            addCriterion("source_field <", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThanOrEqualTo(String value) {
+            addCriterion("source_field <=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLike(String value) {
+            addCriterion("source_field like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotLike(String value) {
+            addCriterion("source_field not like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIn(List<String> values) {
+            addCriterion("source_field in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotIn(List<String> values) {
+            addCriterion("source_field not in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldBetween(String value1, String value2) {
+            addCriterion("source_field between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotBetween(String value1, String value2) {
+            addCriterion("source_field not between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNull() {
+            addCriterion("source_path is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNotNull() {
+            addCriterion("source_path is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathEqualTo(String value) {
+            addCriterion("source_path =", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotEqualTo(String value) {
+            addCriterion("source_path <>", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThan(String value) {
+            addCriterion("source_path >", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThanOrEqualTo(String value) {
+            addCriterion("source_path >=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThan(String value) {
+            addCriterion("source_path <", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThanOrEqualTo(String value) {
+            addCriterion("source_path <=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLike(String value) {
+            addCriterion("source_path like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotLike(String value) {
+            addCriterion("source_path not like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIn(List<String> values) {
+            addCriterion("source_path in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotIn(List<String> values) {
+            addCriterion("source_path not in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathBetween(String value1, String value2) {
+            addCriterion("source_path between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotBetween(String value1, String value2) {
+            addCriterion("source_path not between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashIsNull() {
+            addCriterion("text_hash is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashIsNotNull() {
+            addCriterion("text_hash is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashEqualTo(String value) {
+            addCriterion("text_hash =", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotEqualTo(String value) {
+            addCriterion("text_hash <>", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashGreaterThan(String value) {
+            addCriterion("text_hash >", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashGreaterThanOrEqualTo(String value) {
+            addCriterion("text_hash >=", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashLessThan(String value) {
+            addCriterion("text_hash <", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashLessThanOrEqualTo(String value) {
+            addCriterion("text_hash <=", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashLike(String value) {
+            addCriterion("text_hash like", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotLike(String value) {
+            addCriterion("text_hash not like", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashIn(List<String> values) {
+            addCriterion("text_hash in", values, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotIn(List<String> values) {
+            addCriterion("text_hash not in", values, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashBetween(String value1, String value2) {
+            addCriterion("text_hash between", value1, value2, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotBetween(String value1, String value2) {
+            addCriterion("text_hash not between", value1, value2, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNull() {
+            addCriterion("embedding_model is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNotNull() {
+            addCriterion("embedding_model is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelEqualTo(String value) {
+            addCriterion("embedding_model =", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotEqualTo(String value) {
+            addCriterion("embedding_model <>", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThan(String value) {
+            addCriterion("embedding_model >", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThanOrEqualTo(String value) {
+            addCriterion("embedding_model >=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThan(String value) {
+            addCriterion("embedding_model <", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThanOrEqualTo(String value) {
+            addCriterion("embedding_model <=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLike(String value) {
+            addCriterion("embedding_model like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotLike(String value) {
+            addCriterion("embedding_model not like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIn(List<String> values) {
+            addCriterion("embedding_model in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotIn(List<String> values) {
+            addCriterion("embedding_model not in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelBetween(String value1, String value2) {
+            addCriterion("embedding_model between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotBetween(String value1, String value2) {
+            addCriterion("embedding_model not between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexIsNull() {
+            addCriterion("segment_index is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexIsNotNull() {
+            addCriterion("segment_index is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexEqualTo(Integer value) {
+            addCriterion("segment_index =", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexNotEqualTo(Integer value) {
+            addCriterion("segment_index <>", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexGreaterThan(Integer value) {
+            addCriterion("segment_index >", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexGreaterThanOrEqualTo(Integer value) {
+            addCriterion("segment_index >=", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexLessThan(Integer value) {
+            addCriterion("segment_index <", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexLessThanOrEqualTo(Integer value) {
+            addCriterion("segment_index <=", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexIn(List<Integer> values) {
+            addCriterion("segment_index in", values, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexNotIn(List<Integer> values) {
+            addCriterion("segment_index not in", values, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexBetween(Integer value1, Integer value2) {
+            addCriterion("segment_index between", value1, value2, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexNotBetween(Integer value1, Integer value2) {
+            addCriterion("segment_index not between", value1, value2, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalIsNull() {
+            addCriterion("segment_total is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalIsNotNull() {
+            addCriterion("segment_total is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalEqualTo(Integer value) {
+            addCriterion("segment_total =", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalNotEqualTo(Integer value) {
+            addCriterion("segment_total <>", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalGreaterThan(Integer value) {
+            addCriterion("segment_total >", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalGreaterThanOrEqualTo(Integer value) {
+            addCriterion("segment_total >=", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalLessThan(Integer value) {
+            addCriterion("segment_total <", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalLessThanOrEqualTo(Integer value) {
+            addCriterion("segment_total <=", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalIn(List<Integer> values) {
+            addCriterion("segment_total in", values, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalNotIn(List<Integer> values) {
+            addCriterion("segment_total not in", values, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalBetween(Integer value1, Integer value2) {
+            addCriterion("segment_total between", value1, value2, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalNotBetween(Integer value1, Integer value2) {
+            addCriterion("segment_total not between", value1, value2, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextIsNull() {
+            addCriterion("source_text is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextIsNotNull() {
+            addCriterion("source_text is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextEqualTo(String value) {
+            addCriterion("source_text =", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextNotEqualTo(String value) {
+            addCriterion("source_text <>", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextGreaterThan(String value) {
+            addCriterion("source_text >", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextGreaterThanOrEqualTo(String value) {
+            addCriterion("source_text >=", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextLessThan(String value) {
+            addCriterion("source_text <", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextLessThanOrEqualTo(String value) {
+            addCriterion("source_text <=", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextLike(String value) {
+            addCriterion("source_text like", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextNotLike(String value) {
+            addCriterion("source_text not like", value, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextIn(List<String> values) {
+            addCriterion("source_text in", values, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextNotIn(List<String> values) {
+            addCriterion("source_text not in", values, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextBetween(String value1, String value2) {
+            addCriterion("source_text between", value1, value2, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceTextNotBetween(String value1, String value2) {
+            addCriterion("source_text not between", value1, value2, "sourceText");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNull() {
+            addCriterion("created_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIsNotNull() {
+            addCriterion("created_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtEqualTo(Date value) {
+            addCriterion("created_at =", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotEqualTo(Date value) {
+            addCriterion("created_at <>", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThan(Date value) {
+            addCriterion("created_at >", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("created_at >=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThan(Date value) {
+            addCriterion("created_at <", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("created_at <=", value, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtIn(List<Date> values) {
+            addCriterion("created_at in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotIn(List<Date> values) {
+            addCriterion("created_at not in", values, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtBetween(Date value1, Date value2) {
+            addCriterion("created_at between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("created_at not between", value1, value2, "createdAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNull() {
+            addCriterion("updated_at is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIsNotNull() {
+            addCriterion("updated_at is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtEqualTo(Date value) {
+            addCriterion("updated_at =", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotEqualTo(Date value) {
+            addCriterion("updated_at <>", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThan(Date value) {
+            addCriterion("updated_at >", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) {
+            addCriterion("updated_at >=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThan(Date value) {
+            addCriterion("updated_at <", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtLessThanOrEqualTo(Date value) {
+            addCriterion("updated_at <=", value, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtIn(List<Date> values) {
+            addCriterion("updated_at in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotIn(List<Date> values) {
+            addCriterion("updated_at not in", values, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtBetween(Date value1, Date value2) {
+            addCriterion("updated_at between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdatedAtNotBetween(Date value1, Date value2) {
+            addCriterion("updated_at not between", value1, value2, "updatedAt");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table content_vectors
+     *
+     * @mbg.generated do_not_delete_during_merge Wed Apr 29 15:27:36 CST 2026
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table content_vectors
+     *
+     * @mbg.generated Wed Apr 29 15:27:36 CST 2026
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 712 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructContent.java

@@ -0,0 +1,712 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.Date;
+
+/**
+ * Database Table Remarks:
+ *   内容解构主表
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table deconstruct_content
+ */
+public class DeconstructContent {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   解构任务ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.task_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String taskId;
+
+    /**
+     * Database Column Remarks:
+     *   业务类型:0选题 1创作 2制作
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.biz_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short bizType;
+
+    /**
+     * Database Column Remarks:
+     *   内容类型:1长文 2图文 3视频
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.content_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short contentType;
+
+    /**
+     * Database Column Remarks:
+     *   业务内容ID(帖子ID/视频ID)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.channel_content_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String channelContentId;
+
+    /**
+     * Database Column Remarks:
+     *   标题
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.title
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String title;
+
+    /**
+     * Database Column Remarks:
+     *   正文内容
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.body_text
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String bodyText;
+
+    /**
+     * Database Column Remarks:
+     *   视频地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.video_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String videoUrl;
+
+    /**
+     * Database Column Remarks:
+     *   图片列表(JSON数组)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.images
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String images;
+
+    /**
+     * Database Column Remarks:
+     *   作者ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.channel_account_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String channelAccountId;
+
+    /**
+     * Database Column Remarks:
+     *   作者名称
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.channel_account_name
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String channelAccountName;
+
+    /**
+     * Database Column Remarks:
+     *   任务状态:0待处理 1处理中 2成功 3失败
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.status
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short status;
+
+    /**
+     * Database Column Remarks:
+     *   解构结果JSON字符串
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.result_json
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String resultJson;
+
+    /**
+     * Database Column Remarks:
+     *   失败原因
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.failure_reason
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String failureReason;
+
+    /**
+     * Database Column Remarks:
+     *   选题点结构结果页地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.point_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String pointUrl;
+
+    /**
+     * Database Column Remarks:
+     *   权重页地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.weight_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String weightUrl;
+
+    /**
+     * Database Column Remarks:
+     *   选题点聚类结果页地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.pattern_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String patternUrl;
+
+    /**
+     * Database Column Remarks:
+     *   创建时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.create_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Date createTime;
+
+    /**
+     * Database Column Remarks:
+     *   更新时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.update_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Date updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.id
+     *
+     * @return the value of deconstruct_content.id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.id
+     *
+     * @param id the value for deconstruct_content.id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.task_id
+     *
+     * @return the value of deconstruct_content.task_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getTaskId() {
+        return taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.task_id
+     *
+     * @param taskId the value for deconstruct_content.task_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.biz_type
+     *
+     * @return the value of deconstruct_content.biz_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getBizType() {
+        return bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.biz_type
+     *
+     * @param bizType the value for deconstruct_content.biz_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setBizType(Short bizType) {
+        this.bizType = bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.content_type
+     *
+     * @return the value of deconstruct_content.content_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getContentType() {
+        return contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.content_type
+     *
+     * @param contentType the value for deconstruct_content.content_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setContentType(Short contentType) {
+        this.contentType = contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.channel_content_id
+     *
+     * @return the value of deconstruct_content.channel_content_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getChannelContentId() {
+        return channelContentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.channel_content_id
+     *
+     * @param channelContentId the value for deconstruct_content.channel_content_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setChannelContentId(String channelContentId) {
+        this.channelContentId = channelContentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.title
+     *
+     * @return the value of deconstruct_content.title
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.title
+     *
+     * @param title the value for deconstruct_content.title
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.body_text
+     *
+     * @return the value of deconstruct_content.body_text
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getBodyText() {
+        return bodyText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.body_text
+     *
+     * @param bodyText the value for deconstruct_content.body_text
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setBodyText(String bodyText) {
+        this.bodyText = bodyText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.video_url
+     *
+     * @return the value of deconstruct_content.video_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.video_url
+     *
+     * @param videoUrl the value for deconstruct_content.video_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.images
+     *
+     * @return the value of deconstruct_content.images
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getImages() {
+        return images;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.images
+     *
+     * @param images the value for deconstruct_content.images
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setImages(String images) {
+        this.images = images;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.channel_account_id
+     *
+     * @return the value of deconstruct_content.channel_account_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getChannelAccountId() {
+        return channelAccountId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.channel_account_id
+     *
+     * @param channelAccountId the value for deconstruct_content.channel_account_id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setChannelAccountId(String channelAccountId) {
+        this.channelAccountId = channelAccountId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.channel_account_name
+     *
+     * @return the value of deconstruct_content.channel_account_name
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getChannelAccountName() {
+        return channelAccountName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.channel_account_name
+     *
+     * @param channelAccountName the value for deconstruct_content.channel_account_name
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setChannelAccountName(String channelAccountName) {
+        this.channelAccountName = channelAccountName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.status
+     *
+     * @return the value of deconstruct_content.status
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.status
+     *
+     * @param status the value for deconstruct_content.status
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setStatus(Short status) {
+        this.status = status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.result_json
+     *
+     * @return the value of deconstruct_content.result_json
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getResultJson() {
+        return resultJson;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.result_json
+     *
+     * @param resultJson the value for deconstruct_content.result_json
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setResultJson(String resultJson) {
+        this.resultJson = resultJson;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.failure_reason
+     *
+     * @return the value of deconstruct_content.failure_reason
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getFailureReason() {
+        return failureReason;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.failure_reason
+     *
+     * @param failureReason the value for deconstruct_content.failure_reason
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setFailureReason(String failureReason) {
+        this.failureReason = failureReason;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.point_url
+     *
+     * @return the value of deconstruct_content.point_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getPointUrl() {
+        return pointUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.point_url
+     *
+     * @param pointUrl the value for deconstruct_content.point_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setPointUrl(String pointUrl) {
+        this.pointUrl = pointUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.weight_url
+     *
+     * @return the value of deconstruct_content.weight_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getWeightUrl() {
+        return weightUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.weight_url
+     *
+     * @param weightUrl the value for deconstruct_content.weight_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setWeightUrl(String weightUrl) {
+        this.weightUrl = weightUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.pattern_url
+     *
+     * @return the value of deconstruct_content.pattern_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getPatternUrl() {
+        return patternUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.pattern_url
+     *
+     * @param patternUrl the value for deconstruct_content.pattern_url
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setPatternUrl(String patternUrl) {
+        this.patternUrl = patternUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.create_time
+     *
+     * @return the value of deconstruct_content.create_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.create_time
+     *
+     * @param createTime the value for deconstruct_content.create_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.update_time
+     *
+     * @return the value of deconstruct_content.update_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.update_time
+     *
+     * @param updateTime the value for deconstruct_content.update_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", taskId=").append(taskId);
+        sb.append(", bizType=").append(bizType);
+        sb.append(", contentType=").append(contentType);
+        sb.append(", channelContentId=").append(channelContentId);
+        sb.append(", title=").append(title);
+        sb.append(", bodyText=").append(bodyText);
+        sb.append(", videoUrl=").append(videoUrl);
+        sb.append(", images=").append(images);
+        sb.append(", channelAccountId=").append(channelAccountId);
+        sb.append(", channelAccountName=").append(channelAccountName);
+        sb.append(", status=").append(status);
+        sb.append(", resultJson=").append(resultJson);
+        sb.append(", failureReason=").append(failureReason);
+        sb.append(", pointUrl=").append(pointUrl);
+        sb.append(", weightUrl=").append(weightUrl);
+        sb.append(", patternUrl=").append(patternUrl);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1573 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructContentExample.java

@@ -0,0 +1,1573 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DeconstructContentExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public DeconstructContentExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIsNull() {
+            addCriterion("task_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIsNotNull() {
+            addCriterion("task_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdEqualTo(String value) {
+            addCriterion("task_id =", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotEqualTo(String value) {
+            addCriterion("task_id <>", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThan(String value) {
+            addCriterion("task_id >", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThanOrEqualTo(String value) {
+            addCriterion("task_id >=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThan(String value) {
+            addCriterion("task_id <", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThanOrEqualTo(String value) {
+            addCriterion("task_id <=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLike(String value) {
+            addCriterion("task_id like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotLike(String value) {
+            addCriterion("task_id not like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIn(List<String> values) {
+            addCriterion("task_id in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotIn(List<String> values) {
+            addCriterion("task_id not in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdBetween(String value1, String value2) {
+            addCriterion("task_id between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotBetween(String value1, String value2) {
+            addCriterion("task_id not between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNull() {
+            addCriterion("biz_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNotNull() {
+            addCriterion("biz_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeEqualTo(Short value) {
+            addCriterion("biz_type =", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotEqualTo(Short value) {
+            addCriterion("biz_type <>", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThan(Short value) {
+            addCriterion("biz_type >", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThanOrEqualTo(Short value) {
+            addCriterion("biz_type >=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThan(Short value) {
+            addCriterion("biz_type <", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThanOrEqualTo(Short value) {
+            addCriterion("biz_type <=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIn(List<Short> values) {
+            addCriterion("biz_type in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotIn(List<Short> values) {
+            addCriterion("biz_type not in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeBetween(Short value1, Short value2) {
+            addCriterion("biz_type between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotBetween(Short value1, Short value2) {
+            addCriterion("biz_type not between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNull() {
+            addCriterion("content_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNotNull() {
+            addCriterion("content_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeEqualTo(Short value) {
+            addCriterion("content_type =", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotEqualTo(Short value) {
+            addCriterion("content_type <>", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThan(Short value) {
+            addCriterion("content_type >", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThanOrEqualTo(Short value) {
+            addCriterion("content_type >=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThan(Short value) {
+            addCriterion("content_type <", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThanOrEqualTo(Short value) {
+            addCriterion("content_type <=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIn(List<Short> values) {
+            addCriterion("content_type in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotIn(List<Short> values) {
+            addCriterion("content_type not in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeBetween(Short value1, Short value2) {
+            addCriterion("content_type between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotBetween(Short value1, Short value2) {
+            addCriterion("content_type not between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdIsNull() {
+            addCriterion("channel_content_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdIsNotNull() {
+            addCriterion("channel_content_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdEqualTo(String value) {
+            addCriterion("channel_content_id =", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotEqualTo(String value) {
+            addCriterion("channel_content_id <>", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdGreaterThan(String value) {
+            addCriterion("channel_content_id >", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_content_id >=", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdLessThan(String value) {
+            addCriterion("channel_content_id <", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdLessThanOrEqualTo(String value) {
+            addCriterion("channel_content_id <=", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdLike(String value) {
+            addCriterion("channel_content_id like", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotLike(String value) {
+            addCriterion("channel_content_id not like", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdIn(List<String> values) {
+            addCriterion("channel_content_id in", values, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotIn(List<String> values) {
+            addCriterion("channel_content_id not in", values, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdBetween(String value1, String value2) {
+            addCriterion("channel_content_id between", value1, value2, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotBetween(String value1, String value2) {
+            addCriterion("channel_content_id not between", value1, value2, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNull() {
+            addCriterion("title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNotNull() {
+            addCriterion("title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleEqualTo(String value) {
+            addCriterion("title =", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotEqualTo(String value) {
+            addCriterion("title <>", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThan(String value) {
+            addCriterion("title >", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("title >=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThan(String value) {
+            addCriterion("title <", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThanOrEqualTo(String value) {
+            addCriterion("title <=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLike(String value) {
+            addCriterion("title like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotLike(String value) {
+            addCriterion("title not like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIn(List<String> values) {
+            addCriterion("title in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotIn(List<String> values) {
+            addCriterion("title not in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleBetween(String value1, String value2) {
+            addCriterion("title between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotBetween(String value1, String value2) {
+            addCriterion("title not between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextIsNull() {
+            addCriterion("body_text is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextIsNotNull() {
+            addCriterion("body_text is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextEqualTo(String value) {
+            addCriterion("body_text =", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextNotEqualTo(String value) {
+            addCriterion("body_text <>", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextGreaterThan(String value) {
+            addCriterion("body_text >", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextGreaterThanOrEqualTo(String value) {
+            addCriterion("body_text >=", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextLessThan(String value) {
+            addCriterion("body_text <", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextLessThanOrEqualTo(String value) {
+            addCriterion("body_text <=", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextLike(String value) {
+            addCriterion("body_text like", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextNotLike(String value) {
+            addCriterion("body_text not like", value, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextIn(List<String> values) {
+            addCriterion("body_text in", values, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextNotIn(List<String> values) {
+            addCriterion("body_text not in", values, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextBetween(String value1, String value2) {
+            addCriterion("body_text between", value1, value2, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andBodyTextNotBetween(String value1, String value2) {
+            addCriterion("body_text not between", value1, value2, "bodyText");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlIsNull() {
+            addCriterion("video_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlIsNotNull() {
+            addCriterion("video_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlEqualTo(String value) {
+            addCriterion("video_url =", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotEqualTo(String value) {
+            addCriterion("video_url <>", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlGreaterThan(String value) {
+            addCriterion("video_url >", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("video_url >=", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlLessThan(String value) {
+            addCriterion("video_url <", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlLessThanOrEqualTo(String value) {
+            addCriterion("video_url <=", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlLike(String value) {
+            addCriterion("video_url like", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotLike(String value) {
+            addCriterion("video_url not like", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlIn(List<String> values) {
+            addCriterion("video_url in", values, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotIn(List<String> values) {
+            addCriterion("video_url not in", values, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlBetween(String value1, String value2) {
+            addCriterion("video_url between", value1, value2, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotBetween(String value1, String value2) {
+            addCriterion("video_url not between", value1, value2, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesIsNull() {
+            addCriterion("images is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesIsNotNull() {
+            addCriterion("images is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesEqualTo(String value) {
+            addCriterion("images =", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotEqualTo(String value) {
+            addCriterion("images <>", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesGreaterThan(String value) {
+            addCriterion("images >", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesGreaterThanOrEqualTo(String value) {
+            addCriterion("images >=", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesLessThan(String value) {
+            addCriterion("images <", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesLessThanOrEqualTo(String value) {
+            addCriterion("images <=", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesLike(String value) {
+            addCriterion("images like", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotLike(String value) {
+            addCriterion("images not like", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesIn(List<String> values) {
+            addCriterion("images in", values, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotIn(List<String> values) {
+            addCriterion("images not in", values, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesBetween(String value1, String value2) {
+            addCriterion("images between", value1, value2, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotBetween(String value1, String value2) {
+            addCriterion("images not between", value1, value2, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdIsNull() {
+            addCriterion("channel_account_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdIsNotNull() {
+            addCriterion("channel_account_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdEqualTo(String value) {
+            addCriterion("channel_account_id =", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotEqualTo(String value) {
+            addCriterion("channel_account_id <>", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdGreaterThan(String value) {
+            addCriterion("channel_account_id >", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_account_id >=", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdLessThan(String value) {
+            addCriterion("channel_account_id <", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdLessThanOrEqualTo(String value) {
+            addCriterion("channel_account_id <=", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdLike(String value) {
+            addCriterion("channel_account_id like", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotLike(String value) {
+            addCriterion("channel_account_id not like", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdIn(List<String> values) {
+            addCriterion("channel_account_id in", values, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotIn(List<String> values) {
+            addCriterion("channel_account_id not in", values, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdBetween(String value1, String value2) {
+            addCriterion("channel_account_id between", value1, value2, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotBetween(String value1, String value2) {
+            addCriterion("channel_account_id not between", value1, value2, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameIsNull() {
+            addCriterion("channel_account_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameIsNotNull() {
+            addCriterion("channel_account_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameEqualTo(String value) {
+            addCriterion("channel_account_name =", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotEqualTo(String value) {
+            addCriterion("channel_account_name <>", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameGreaterThan(String value) {
+            addCriterion("channel_account_name >", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_account_name >=", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameLessThan(String value) {
+            addCriterion("channel_account_name <", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameLessThanOrEqualTo(String value) {
+            addCriterion("channel_account_name <=", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameLike(String value) {
+            addCriterion("channel_account_name like", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotLike(String value) {
+            addCriterion("channel_account_name not like", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameIn(List<String> values) {
+            addCriterion("channel_account_name in", values, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotIn(List<String> values) {
+            addCriterion("channel_account_name not in", values, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameBetween(String value1, String value2) {
+            addCriterion("channel_account_name between", value1, value2, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotBetween(String value1, String value2) {
+            addCriterion("channel_account_name not between", value1, value2, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("\"status\" is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("\"status\" is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Short value) {
+            addCriterion("\"status\" =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Short value) {
+            addCriterion("\"status\" <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Short value) {
+            addCriterion("\"status\" >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Short value) {
+            addCriterion("\"status\" >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Short value) {
+            addCriterion("\"status\" <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Short value) {
+            addCriterion("\"status\" <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Short> values) {
+            addCriterion("\"status\" in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Short> values) {
+            addCriterion("\"status\" not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Short value1, Short value2) {
+            addCriterion("\"status\" between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Short value1, Short value2) {
+            addCriterion("\"status\" not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonIsNull() {
+            addCriterion("result_json is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonIsNotNull() {
+            addCriterion("result_json is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonEqualTo(String value) {
+            addCriterion("result_json =", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonNotEqualTo(String value) {
+            addCriterion("result_json <>", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonGreaterThan(String value) {
+            addCriterion("result_json >", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonGreaterThanOrEqualTo(String value) {
+            addCriterion("result_json >=", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonLessThan(String value) {
+            addCriterion("result_json <", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonLessThanOrEqualTo(String value) {
+            addCriterion("result_json <=", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonLike(String value) {
+            addCriterion("result_json like", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonNotLike(String value) {
+            addCriterion("result_json not like", value, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonIn(List<String> values) {
+            addCriterion("result_json in", values, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonNotIn(List<String> values) {
+            addCriterion("result_json not in", values, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonBetween(String value1, String value2) {
+            addCriterion("result_json between", value1, value2, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultJsonNotBetween(String value1, String value2) {
+            addCriterion("result_json not between", value1, value2, "resultJson");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonIsNull() {
+            addCriterion("failure_reason is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonIsNotNull() {
+            addCriterion("failure_reason is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonEqualTo(String value) {
+            addCriterion("failure_reason =", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotEqualTo(String value) {
+            addCriterion("failure_reason <>", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonGreaterThan(String value) {
+            addCriterion("failure_reason >", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonGreaterThanOrEqualTo(String value) {
+            addCriterion("failure_reason >=", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonLessThan(String value) {
+            addCriterion("failure_reason <", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonLessThanOrEqualTo(String value) {
+            addCriterion("failure_reason <=", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonLike(String value) {
+            addCriterion("failure_reason like", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotLike(String value) {
+            addCriterion("failure_reason not like", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonIn(List<String> values) {
+            addCriterion("failure_reason in", values, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotIn(List<String> values) {
+            addCriterion("failure_reason not in", values, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonBetween(String value1, String value2) {
+            addCriterion("failure_reason between", value1, value2, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotBetween(String value1, String value2) {
+            addCriterion("failure_reason not between", value1, value2, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlIsNull() {
+            addCriterion("point_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlIsNotNull() {
+            addCriterion("point_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlEqualTo(String value) {
+            addCriterion("point_url =", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotEqualTo(String value) {
+            addCriterion("point_url <>", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlGreaterThan(String value) {
+            addCriterion("point_url >", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("point_url >=", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlLessThan(String value) {
+            addCriterion("point_url <", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlLessThanOrEqualTo(String value) {
+            addCriterion("point_url <=", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlLike(String value) {
+            addCriterion("point_url like", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotLike(String value) {
+            addCriterion("point_url not like", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlIn(List<String> values) {
+            addCriterion("point_url in", values, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotIn(List<String> values) {
+            addCriterion("point_url not in", values, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlBetween(String value1, String value2) {
+            addCriterion("point_url between", value1, value2, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotBetween(String value1, String value2) {
+            addCriterion("point_url not between", value1, value2, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlIsNull() {
+            addCriterion("weight_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlIsNotNull() {
+            addCriterion("weight_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlEqualTo(String value) {
+            addCriterion("weight_url =", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotEqualTo(String value) {
+            addCriterion("weight_url <>", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlGreaterThan(String value) {
+            addCriterion("weight_url >", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("weight_url >=", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlLessThan(String value) {
+            addCriterion("weight_url <", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlLessThanOrEqualTo(String value) {
+            addCriterion("weight_url <=", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlLike(String value) {
+            addCriterion("weight_url like", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotLike(String value) {
+            addCriterion("weight_url not like", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlIn(List<String> values) {
+            addCriterion("weight_url in", values, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotIn(List<String> values) {
+            addCriterion("weight_url not in", values, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlBetween(String value1, String value2) {
+            addCriterion("weight_url between", value1, value2, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotBetween(String value1, String value2) {
+            addCriterion("weight_url not between", value1, value2, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlIsNull() {
+            addCriterion("pattern_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlIsNotNull() {
+            addCriterion("pattern_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlEqualTo(String value) {
+            addCriterion("pattern_url =", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotEqualTo(String value) {
+            addCriterion("pattern_url <>", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlGreaterThan(String value) {
+            addCriterion("pattern_url >", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("pattern_url >=", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlLessThan(String value) {
+            addCriterion("pattern_url <", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlLessThanOrEqualTo(String value) {
+            addCriterion("pattern_url <=", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlLike(String value) {
+            addCriterion("pattern_url like", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotLike(String value) {
+            addCriterion("pattern_url not like", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlIn(List<String> values) {
+            addCriterion("pattern_url in", values, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotIn(List<String> values) {
+            addCriterion("pattern_url not in", values, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlBetween(String value1, String value2) {
+            addCriterion("pattern_url between", value1, value2, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotBetween(String value1, String value2) {
+            addCriterion("pattern_url not between", value1, value2, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated do_not_delete_during_merge Wed Apr 29 15:35:34 CST 2026
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 640 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructVectorConfig.java

@@ -0,0 +1,640 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.Date;
+
+/**
+ * Database Table Remarks:
+ *   向量化字段配置表
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table deconstruct_vector_config
+ */
+public class DeconstructVectorConfig {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   配置编码
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.config_code
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String configCode;
+
+    /**
+     * Database Column Remarks:
+     *   配置名称
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.config_name
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String configName;
+
+    /**
+     * Database Column Remarks:
+     *   业务类型:0选题 1创作 2制作(null表示全部)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.biz_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short bizType;
+
+    /**
+     * Database Column Remarks:
+     *   内容类型:1长文 2图文 3视频(null表示全部)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.content_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short contentType;
+
+    /**
+     * Database Column Remarks:
+     *   来源字段名
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.source_field
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String sourceField;
+
+    /**
+     * Database Column Remarks:
+     *   JSON提取路径
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.source_path
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String sourcePath;
+
+    /**
+     * Database Column Remarks:
+     *   提取规则(正则/JSONPath等)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.extract_rule
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String extractRule;
+
+    /**
+     * Database Column Remarks:
+     *   默认嵌入模型
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.embedding_model
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private String embeddingModel;
+
+    /**
+     * Database Column Remarks:
+     *   维度
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.dimension
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Integer dimension;
+
+    /**
+     * Database Column Remarks:
+     *   最大文本长度
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.max_length
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Integer maxLength;
+
+    /**
+     * Database Column Remarks:
+     *   是否分段:0否 1是
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.enable_segment
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short enableSegment;
+
+    /**
+     * Database Column Remarks:
+     *   分段大小
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.segment_size
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Integer segmentSize;
+
+    /**
+     * Database Column Remarks:
+     *   优先级(数字越小越优先)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.priority
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Integer priority;
+
+    /**
+     * Database Column Remarks:
+     *   是否启用:0禁用 1启用
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.enabled
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Short enabled;
+
+    /**
+     * Database Column Remarks:
+     *   创建时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.create_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Date createTime;
+
+    /**
+     * Database Column Remarks:
+     *   更新时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.update_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    private Date updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.id
+     *
+     * @return the value of deconstruct_vector_config.id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.id
+     *
+     * @param id the value for deconstruct_vector_config.id
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.config_code
+     *
+     * @return the value of deconstruct_vector_config.config_code
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getConfigCode() {
+        return configCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.config_code
+     *
+     * @param configCode the value for deconstruct_vector_config.config_code
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setConfigCode(String configCode) {
+        this.configCode = configCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.config_name
+     *
+     * @return the value of deconstruct_vector_config.config_name
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getConfigName() {
+        return configName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.config_name
+     *
+     * @param configName the value for deconstruct_vector_config.config_name
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setConfigName(String configName) {
+        this.configName = configName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.biz_type
+     *
+     * @return the value of deconstruct_vector_config.biz_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getBizType() {
+        return bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.biz_type
+     *
+     * @param bizType the value for deconstruct_vector_config.biz_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setBizType(Short bizType) {
+        this.bizType = bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.content_type
+     *
+     * @return the value of deconstruct_vector_config.content_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getContentType() {
+        return contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.content_type
+     *
+     * @param contentType the value for deconstruct_vector_config.content_type
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setContentType(Short contentType) {
+        this.contentType = contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.source_field
+     *
+     * @return the value of deconstruct_vector_config.source_field
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getSourceField() {
+        return sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.source_field
+     *
+     * @param sourceField the value for deconstruct_vector_config.source_field
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setSourceField(String sourceField) {
+        this.sourceField = sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.source_path
+     *
+     * @return the value of deconstruct_vector_config.source_path
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getSourcePath() {
+        return sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.source_path
+     *
+     * @param sourcePath the value for deconstruct_vector_config.source_path
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setSourcePath(String sourcePath) {
+        this.sourcePath = sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.extract_rule
+     *
+     * @return the value of deconstruct_vector_config.extract_rule
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getExtractRule() {
+        return extractRule;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.extract_rule
+     *
+     * @param extractRule the value for deconstruct_vector_config.extract_rule
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setExtractRule(String extractRule) {
+        this.extractRule = extractRule;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.embedding_model
+     *
+     * @return the value of deconstruct_vector_config.embedding_model
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getEmbeddingModel() {
+        return embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.embedding_model
+     *
+     * @param embeddingModel the value for deconstruct_vector_config.embedding_model
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setEmbeddingModel(String embeddingModel) {
+        this.embeddingModel = embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.dimension
+     *
+     * @return the value of deconstruct_vector_config.dimension
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Integer getDimension() {
+        return dimension;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.dimension
+     *
+     * @param dimension the value for deconstruct_vector_config.dimension
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setDimension(Integer dimension) {
+        this.dimension = dimension;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.max_length
+     *
+     * @return the value of deconstruct_vector_config.max_length
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.max_length
+     *
+     * @param maxLength the value for deconstruct_vector_config.max_length
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.enable_segment
+     *
+     * @return the value of deconstruct_vector_config.enable_segment
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getEnableSegment() {
+        return enableSegment;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.enable_segment
+     *
+     * @param enableSegment the value for deconstruct_vector_config.enable_segment
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setEnableSegment(Short enableSegment) {
+        this.enableSegment = enableSegment;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.segment_size
+     *
+     * @return the value of deconstruct_vector_config.segment_size
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Integer getSegmentSize() {
+        return segmentSize;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.segment_size
+     *
+     * @param segmentSize the value for deconstruct_vector_config.segment_size
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setSegmentSize(Integer segmentSize) {
+        this.segmentSize = segmentSize;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.priority
+     *
+     * @return the value of deconstruct_vector_config.priority
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Integer getPriority() {
+        return priority;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.priority
+     *
+     * @param priority the value for deconstruct_vector_config.priority
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.enabled
+     *
+     * @return the value of deconstruct_vector_config.enabled
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Short getEnabled() {
+        return enabled;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.enabled
+     *
+     * @param enabled the value for deconstruct_vector_config.enabled
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setEnabled(Short enabled) {
+        this.enabled = enabled;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.create_time
+     *
+     * @return the value of deconstruct_vector_config.create_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.create_time
+     *
+     * @param createTime the value for deconstruct_vector_config.create_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.update_time
+     *
+     * @return the value of deconstruct_vector_config.update_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.update_time
+     *
+     * @param updateTime the value for deconstruct_vector_config.update_time
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", configCode=").append(configCode);
+        sb.append(", configName=").append(configName);
+        sb.append(", bizType=").append(bizType);
+        sb.append(", contentType=").append(contentType);
+        sb.append(", sourceField=").append(sourceField);
+        sb.append(", sourcePath=").append(sourcePath);
+        sb.append(", extractRule=").append(extractRule);
+        sb.append(", embeddingModel=").append(embeddingModel);
+        sb.append(", dimension=").append(dimension);
+        sb.append(", maxLength=").append(maxLength);
+        sb.append(", enableSegment=").append(enableSegment);
+        sb.append(", segmentSize=").append(segmentSize);
+        sb.append(", priority=").append(priority);
+        sb.append(", enabled=").append(enabled);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1383 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/DeconstructVectorConfigExample.java

@@ -0,0 +1,1383 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DeconstructVectorConfigExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public DeconstructVectorConfigExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIsNull() {
+            addCriterion("config_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIsNotNull() {
+            addCriterion("config_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeEqualTo(String value) {
+            addCriterion("config_code =", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotEqualTo(String value) {
+            addCriterion("config_code <>", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeGreaterThan(String value) {
+            addCriterion("config_code >", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("config_code >=", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLessThan(String value) {
+            addCriterion("config_code <", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLessThanOrEqualTo(String value) {
+            addCriterion("config_code <=", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLike(String value) {
+            addCriterion("config_code like", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotLike(String value) {
+            addCriterion("config_code not like", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIn(List<String> values) {
+            addCriterion("config_code in", values, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotIn(List<String> values) {
+            addCriterion("config_code not in", values, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeBetween(String value1, String value2) {
+            addCriterion("config_code between", value1, value2, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotBetween(String value1, String value2) {
+            addCriterion("config_code not between", value1, value2, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameIsNull() {
+            addCriterion("config_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameIsNotNull() {
+            addCriterion("config_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameEqualTo(String value) {
+            addCriterion("config_name =", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotEqualTo(String value) {
+            addCriterion("config_name <>", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameGreaterThan(String value) {
+            addCriterion("config_name >", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameGreaterThanOrEqualTo(String value) {
+            addCriterion("config_name >=", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameLessThan(String value) {
+            addCriterion("config_name <", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameLessThanOrEqualTo(String value) {
+            addCriterion("config_name <=", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameLike(String value) {
+            addCriterion("config_name like", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotLike(String value) {
+            addCriterion("config_name not like", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameIn(List<String> values) {
+            addCriterion("config_name in", values, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotIn(List<String> values) {
+            addCriterion("config_name not in", values, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameBetween(String value1, String value2) {
+            addCriterion("config_name between", value1, value2, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotBetween(String value1, String value2) {
+            addCriterion("config_name not between", value1, value2, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNull() {
+            addCriterion("biz_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNotNull() {
+            addCriterion("biz_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeEqualTo(Short value) {
+            addCriterion("biz_type =", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotEqualTo(Short value) {
+            addCriterion("biz_type <>", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThan(Short value) {
+            addCriterion("biz_type >", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThanOrEqualTo(Short value) {
+            addCriterion("biz_type >=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThan(Short value) {
+            addCriterion("biz_type <", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThanOrEqualTo(Short value) {
+            addCriterion("biz_type <=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIn(List<Short> values) {
+            addCriterion("biz_type in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotIn(List<Short> values) {
+            addCriterion("biz_type not in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeBetween(Short value1, Short value2) {
+            addCriterion("biz_type between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotBetween(Short value1, Short value2) {
+            addCriterion("biz_type not between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNull() {
+            addCriterion("content_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNotNull() {
+            addCriterion("content_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeEqualTo(Short value) {
+            addCriterion("content_type =", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotEqualTo(Short value) {
+            addCriterion("content_type <>", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThan(Short value) {
+            addCriterion("content_type >", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThanOrEqualTo(Short value) {
+            addCriterion("content_type >=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThan(Short value) {
+            addCriterion("content_type <", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThanOrEqualTo(Short value) {
+            addCriterion("content_type <=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIn(List<Short> values) {
+            addCriterion("content_type in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotIn(List<Short> values) {
+            addCriterion("content_type not in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeBetween(Short value1, Short value2) {
+            addCriterion("content_type between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotBetween(Short value1, Short value2) {
+            addCriterion("content_type not between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNull() {
+            addCriterion("source_field is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNotNull() {
+            addCriterion("source_field is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldEqualTo(String value) {
+            addCriterion("source_field =", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotEqualTo(String value) {
+            addCriterion("source_field <>", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThan(String value) {
+            addCriterion("source_field >", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThanOrEqualTo(String value) {
+            addCriterion("source_field >=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThan(String value) {
+            addCriterion("source_field <", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThanOrEqualTo(String value) {
+            addCriterion("source_field <=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLike(String value) {
+            addCriterion("source_field like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotLike(String value) {
+            addCriterion("source_field not like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIn(List<String> values) {
+            addCriterion("source_field in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotIn(List<String> values) {
+            addCriterion("source_field not in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldBetween(String value1, String value2) {
+            addCriterion("source_field between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotBetween(String value1, String value2) {
+            addCriterion("source_field not between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNull() {
+            addCriterion("source_path is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNotNull() {
+            addCriterion("source_path is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathEqualTo(String value) {
+            addCriterion("source_path =", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotEqualTo(String value) {
+            addCriterion("source_path <>", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThan(String value) {
+            addCriterion("source_path >", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThanOrEqualTo(String value) {
+            addCriterion("source_path >=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThan(String value) {
+            addCriterion("source_path <", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThanOrEqualTo(String value) {
+            addCriterion("source_path <=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLike(String value) {
+            addCriterion("source_path like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotLike(String value) {
+            addCriterion("source_path not like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIn(List<String> values) {
+            addCriterion("source_path in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotIn(List<String> values) {
+            addCriterion("source_path not in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathBetween(String value1, String value2) {
+            addCriterion("source_path between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotBetween(String value1, String value2) {
+            addCriterion("source_path not between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleIsNull() {
+            addCriterion("extract_rule is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleIsNotNull() {
+            addCriterion("extract_rule is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleEqualTo(String value) {
+            addCriterion("extract_rule =", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotEqualTo(String value) {
+            addCriterion("extract_rule <>", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleGreaterThan(String value) {
+            addCriterion("extract_rule >", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleGreaterThanOrEqualTo(String value) {
+            addCriterion("extract_rule >=", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleLessThan(String value) {
+            addCriterion("extract_rule <", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleLessThanOrEqualTo(String value) {
+            addCriterion("extract_rule <=", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleLike(String value) {
+            addCriterion("extract_rule like", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotLike(String value) {
+            addCriterion("extract_rule not like", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleIn(List<String> values) {
+            addCriterion("extract_rule in", values, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotIn(List<String> values) {
+            addCriterion("extract_rule not in", values, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleBetween(String value1, String value2) {
+            addCriterion("extract_rule between", value1, value2, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotBetween(String value1, String value2) {
+            addCriterion("extract_rule not between", value1, value2, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNull() {
+            addCriterion("embedding_model is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNotNull() {
+            addCriterion("embedding_model is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelEqualTo(String value) {
+            addCriterion("embedding_model =", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotEqualTo(String value) {
+            addCriterion("embedding_model <>", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThan(String value) {
+            addCriterion("embedding_model >", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThanOrEqualTo(String value) {
+            addCriterion("embedding_model >=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThan(String value) {
+            addCriterion("embedding_model <", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThanOrEqualTo(String value) {
+            addCriterion("embedding_model <=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLike(String value) {
+            addCriterion("embedding_model like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotLike(String value) {
+            addCriterion("embedding_model not like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIn(List<String> values) {
+            addCriterion("embedding_model in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotIn(List<String> values) {
+            addCriterion("embedding_model not in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelBetween(String value1, String value2) {
+            addCriterion("embedding_model between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotBetween(String value1, String value2) {
+            addCriterion("embedding_model not between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionIsNull() {
+            addCriterion("dimension is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionIsNotNull() {
+            addCriterion("dimension is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionEqualTo(Integer value) {
+            addCriterion("dimension =", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotEqualTo(Integer value) {
+            addCriterion("dimension <>", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionGreaterThan(Integer value) {
+            addCriterion("dimension >", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionGreaterThanOrEqualTo(Integer value) {
+            addCriterion("dimension >=", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionLessThan(Integer value) {
+            addCriterion("dimension <", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionLessThanOrEqualTo(Integer value) {
+            addCriterion("dimension <=", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionIn(List<Integer> values) {
+            addCriterion("dimension in", values, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotIn(List<Integer> values) {
+            addCriterion("dimension not in", values, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionBetween(Integer value1, Integer value2) {
+            addCriterion("dimension between", value1, value2, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotBetween(Integer value1, Integer value2) {
+            addCriterion("dimension not between", value1, value2, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthIsNull() {
+            addCriterion("max_length is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthIsNotNull() {
+            addCriterion("max_length is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthEqualTo(Integer value) {
+            addCriterion("max_length =", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthNotEqualTo(Integer value) {
+            addCriterion("max_length <>", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthGreaterThan(Integer value) {
+            addCriterion("max_length >", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthGreaterThanOrEqualTo(Integer value) {
+            addCriterion("max_length >=", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthLessThan(Integer value) {
+            addCriterion("max_length <", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthLessThanOrEqualTo(Integer value) {
+            addCriterion("max_length <=", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthIn(List<Integer> values) {
+            addCriterion("max_length in", values, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthNotIn(List<Integer> values) {
+            addCriterion("max_length not in", values, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthBetween(Integer value1, Integer value2) {
+            addCriterion("max_length between", value1, value2, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthNotBetween(Integer value1, Integer value2) {
+            addCriterion("max_length not between", value1, value2, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentIsNull() {
+            addCriterion("enable_segment is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentIsNotNull() {
+            addCriterion("enable_segment is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentEqualTo(Short value) {
+            addCriterion("enable_segment =", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentNotEqualTo(Short value) {
+            addCriterion("enable_segment <>", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentGreaterThan(Short value) {
+            addCriterion("enable_segment >", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentGreaterThanOrEqualTo(Short value) {
+            addCriterion("enable_segment >=", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentLessThan(Short value) {
+            addCriterion("enable_segment <", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentLessThanOrEqualTo(Short value) {
+            addCriterion("enable_segment <=", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentIn(List<Short> values) {
+            addCriterion("enable_segment in", values, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentNotIn(List<Short> values) {
+            addCriterion("enable_segment not in", values, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentBetween(Short value1, Short value2) {
+            addCriterion("enable_segment between", value1, value2, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentNotBetween(Short value1, Short value2) {
+            addCriterion("enable_segment not between", value1, value2, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeIsNull() {
+            addCriterion("segment_size is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeIsNotNull() {
+            addCriterion("segment_size is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeEqualTo(Integer value) {
+            addCriterion("segment_size =", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeNotEqualTo(Integer value) {
+            addCriterion("segment_size <>", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeGreaterThan(Integer value) {
+            addCriterion("segment_size >", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("segment_size >=", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeLessThan(Integer value) {
+            addCriterion("segment_size <", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeLessThanOrEqualTo(Integer value) {
+            addCriterion("segment_size <=", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeIn(List<Integer> values) {
+            addCriterion("segment_size in", values, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeNotIn(List<Integer> values) {
+            addCriterion("segment_size not in", values, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeBetween(Integer value1, Integer value2) {
+            addCriterion("segment_size between", value1, value2, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeNotBetween(Integer value1, Integer value2) {
+            addCriterion("segment_size not between", value1, value2, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIsNull() {
+            addCriterion("priority is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIsNotNull() {
+            addCriterion("priority is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityEqualTo(Integer value) {
+            addCriterion("priority =", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotEqualTo(Integer value) {
+            addCriterion("priority <>", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityGreaterThan(Integer value) {
+            addCriterion("priority >", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityGreaterThanOrEqualTo(Integer value) {
+            addCriterion("priority >=", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityLessThan(Integer value) {
+            addCriterion("priority <", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityLessThanOrEqualTo(Integer value) {
+            addCriterion("priority <=", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIn(List<Integer> values) {
+            addCriterion("priority in", values, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotIn(List<Integer> values) {
+            addCriterion("priority not in", values, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityBetween(Integer value1, Integer value2) {
+            addCriterion("priority between", value1, value2, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotBetween(Integer value1, Integer value2) {
+            addCriterion("priority not between", value1, value2, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Short value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Short value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Short value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Short value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Short value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Short value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Short> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Short> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Short value1, Short value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Short value1, Short value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated do_not_delete_during_merge Wed Apr 29 15:35:34 CST 2026
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Wed Apr 29 15:35:34 CST 2026
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 27 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/VideoVector.java

@@ -53,6 +53,33 @@ public class VideoVector {
      */
     private Date updatedAt;
 
+    /**
+     * embedding 向量字段(vector(1024)类型,以字符串形式传递)
+     * 格式示例: "[0.1,0.2,...]"
+     */
+    private String embedding;
+
+    public String getEmbedding() {
+        return embedding;
+    }
+
+    public void setEmbedding(String embedding) {
+        this.embedding = embedding;
+    }
+
+    /**
+     * 余弦相似度得分(仅搜索时使用,非持久化字段)
+     */
+    private Double score;
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
     /**
      * This method was generated by MyBatis Generator.
      * This method returns the value of the database column video_vectors.id

+ 1 - 1
core/src/main/java/com/tzld/videoVector/service/EmbeddingService.java

@@ -1,6 +1,6 @@
 package com.tzld.videoVector.service;
 
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
 
 import java.util.List;
 

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

@@ -9,7 +9,7 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * 向量存储服务接口(Redis 实现)
+ * 向量存储服务接口(pgvector 实现)
  * 支持按配置编码(configCode)存储多类型向量
  */
 public interface VectorStoreService {

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

@@ -1,8 +1,8 @@
 package com.tzld.videoVector.service;
 
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
 import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
 
 import java.util.List;
 

+ 1 - 1
core/src/main/java/com/tzld/videoVector/service/impl/EmbeddingServiceImpl.java

@@ -1,7 +1,7 @@
 package com.tzld.videoVector.service.impl;
 
 import com.tzld.videoVector.api.DashScopeEmbeddingApiService;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
 import com.tzld.videoVector.service.EmbeddingService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;

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

@@ -0,0 +1,271 @@
+package com.tzld.videoVector.service.impl;
+
+import com.tzld.videoVector.dao.mapper.pgVector.VideoVectorMapper;
+import com.tzld.videoVector.model.entity.VideoMatch;
+import com.tzld.videoVector.model.po.pgVector.VideoVector;
+import com.tzld.videoVector.service.VectorStoreService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 基于 PostgreSQL pgvector 的向量存储服务实现
+ *
+ * <p>利用 pgvector 的 HNSW 索引实现高效的余弦相似度搜索,
+ * 替代原有 Redis 暴力搜索方案,解决内存爆炸和延迟问题。
+ *
+ * <p>存储结构:
+ * <ul>
+ *   <li>表:video_vectors (id, video_id, config_code, embedding vector(1024), created_at, updated_at)</li>
+ *   <li>唯一索引:(video_id, config_code)</li>
+ *   <li>HNSW 索引:embedding 列,基于余弦距离</li>
+ * </ul>
+ */
+@Slf4j
+@Service
+public class PgVectorStoreServiceImpl implements VectorStoreService {
+
+    @Autowired
+    private VideoVectorMapper videoVectorMapper;
+
+    // ---------------------------------------------------------------- CRUD
+
+    @Override
+    public void save(Long videoId, List<Float> vector) {
+        save(DEFAULT_CONFIG_CODE, videoId, vector);
+    }
+
+    @Override
+    public void save(String configCode, Long videoId, List<Float> vector) {
+        if (videoId == null || vector == null || vector.isEmpty()) {
+            log.warn("save 参数非法,configCode={}, videoId={}", configCode, videoId);
+            return;
+        }
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+
+        String embedding = vectorToString(vector);
+        videoVectorMapper.upsertVector(videoId, configCode, embedding);
+        log.debug("保存向量成功,configCode={}, videoId={}, 维度={}", configCode, videoId, vector.size());
+    }
+
+    @Override
+    public boolean exists(Long videoId) {
+        return exists(DEFAULT_CONFIG_CODE, videoId);
+    }
+
+    @Override
+    public boolean exists(String configCode, Long videoId) {
+        if (videoId == null) return false;
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+        return videoVectorMapper.existsByVideoIdAndConfigCode(videoId, configCode) > 0;
+    }
+
+    @Override
+    public Set<Long> existsByIds(Collection<Long> videoIds) {
+        return existsByIds(DEFAULT_CONFIG_CODE, videoIds);
+    }
+
+    @Override
+    public Set<Long> existsByIds(String configCode, Collection<Long> videoIds) {
+        if (videoIds == null || videoIds.isEmpty()) return Collections.emptySet();
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+
+        List<Long> idList = new ArrayList<>(videoIds);
+        // 分批查询,避免 IN 子句过长
+        Set<Long> existing = new HashSet<>();
+        int batchSize = 1000;
+        for (int i = 0; i < idList.size(); i += batchSize) {
+            int end = Math.min(i + batchSize, idList.size());
+            List<Long> batch = idList.subList(i, end);
+            List<Long> found = videoVectorMapper.selectExistingVideoIds(batch, configCode);
+            if (found != null) {
+                existing.addAll(found);
+            }
+        }
+        return existing;
+    }
+
+    @Override
+    public List<Float> getVector(Long videoId) {
+        return getVector(DEFAULT_CONFIG_CODE, videoId);
+    }
+
+    @Override
+    public List<Float> getVector(String configCode, Long videoId) {
+        if (videoId == null) return null;
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+
+        String embedding = videoVectorMapper.selectEmbeddingByVideoIdAndConfigCode(videoId, configCode);
+        return parseVectorString(embedding);
+    }
+
+    @Override
+    public Map<Long, List<Float>> getVectors(Collection<Long> videoIds) {
+        return getVectors(DEFAULT_CONFIG_CODE, videoIds);
+    }
+
+    @Override
+    public Map<Long, List<Float>> getVectors(String configCode, Collection<Long> videoIds) {
+        if (videoIds == null || videoIds.isEmpty()) return Collections.emptyMap();
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+
+        List<Long> idList = new ArrayList<>(videoIds);
+        Map<Long, List<Float>> result = new HashMap<>();
+        int batchSize = 1000;
+
+        for (int i = 0; i < idList.size(); i += batchSize) {
+            int end = Math.min(i + batchSize, idList.size());
+            List<Long> batch = idList.subList(i, end);
+            List<VideoVector> vectors = videoVectorMapper.selectVectorsByVideoIds(batch, configCode);
+            if (vectors != null) {
+                for (VideoVector vv : vectors) {
+                    List<Float> parsed = parseVectorString(vv.getEmbedding());
+                    if (parsed != null) {
+                        result.put(vv.getVideoId(), parsed);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public Set<Long> getAllVideoIds() {
+        return getAllVideoIds(DEFAULT_CONFIG_CODE);
+    }
+
+    @Override
+    public Set<Long> getAllVideoIds(String configCode) {
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+        List<Long> ids = videoVectorMapper.selectAllVideoIdsByConfigCode(configCode);
+        if (ids == null) return Collections.emptySet();
+        return new HashSet<>(ids);
+    }
+
+    @Override
+    public void delete(Long videoId) {
+        delete(DEFAULT_CONFIG_CODE, videoId);
+    }
+
+    @Override
+    public void delete(String configCode, Long videoId) {
+        if (videoId == null) return;
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+        videoVectorMapper.deleteByVideoIdAndConfigCode(videoId, configCode);
+        log.debug("删除向量成功,configCode={}, videoId={}", configCode, videoId);
+    }
+
+    @Override
+    public void deleteBatch(Collection<Long> videoIds) {
+        deleteBatch(DEFAULT_CONFIG_CODE, videoIds);
+    }
+
+    @Override
+    public void deleteBatch(String configCode, Collection<Long> videoIds) {
+        if (videoIds == null || videoIds.isEmpty()) return;
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+
+        List<Long> idList = new ArrayList<>(videoIds);
+        int batchSize = 1000;
+        for (int i = 0; i < idList.size(); i += batchSize) {
+            int end = Math.min(i + batchSize, idList.size());
+            List<Long> batch = idList.subList(i, end);
+            videoVectorMapper.deleteBatchByVideoIdsAndConfigCode(batch, configCode);
+        }
+        log.info("批量删除向量成功,configCode={}, 数量={}", configCode, videoIds.size());
+    }
+
+    // ---------------------------------------------------------------- 搜索
+
+    @Override
+    public List<VideoMatch> searchTopN(List<Float> queryVector, int topN) {
+        return searchTopN(DEFAULT_CONFIG_CODE, queryVector, topN);
+    }
+
+    @Override
+    public List<VideoMatch> searchTopN(String configCode, List<Float> queryVector, int topN) {
+        if (queryVector == null || queryVector.isEmpty() || topN <= 0) {
+            return Collections.emptyList();
+        }
+        if (configCode == null || configCode.isEmpty()) {
+            configCode = DEFAULT_CONFIG_CODE;
+        }
+
+        String queryVectorStr = vectorToString(queryVector);
+        log.info("开始pgvector搜索,configCode={},topN={}", configCode, topN);
+
+        List<VideoVector> results = videoVectorMapper.searchTopNByCosine(configCode, queryVectorStr, topN);
+        if (results == null || results.isEmpty()) {
+            log.info("向量库为空或无匹配结果,configCode={}", configCode);
+            return Collections.emptyList();
+        }
+
+        List<VideoMatch> matches = results.stream()
+                .map(vv -> new VideoMatch(vv.getVideoId(), vv.getScore() != null ? vv.getScore() : 0.0))
+                .collect(Collectors.toList());
+
+        log.info("pgvector搜索完成,configCode={},返回 {} 条结果", configCode, matches.size());
+        return matches;
+    }
+
+    // ---------------------------------------------------------------- 工具方法
+
+    /**
+     * 将 List<Float> 转换为 pgvector 格式字符串: "[0.1,0.2,...]"
+     */
+    private String vectorToString(List<Float> vector) {
+        StringBuilder sb = new StringBuilder("[");
+        for (int i = 0; i < vector.size(); i++) {
+            if (i > 0) sb.append(",");
+            sb.append(vector.get(i));
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+    /**
+     * 解析 pgvector 字符串为 List<Float>
+     * 格式: "[0.1,0.2,...]"
+     */
+    private List<Float> parseVectorString(String vectorStr) {
+        if (vectorStr == null || vectorStr.isEmpty()) return null;
+        try {
+            // 去除首尾的方括号
+            String trimmed = vectorStr.trim();
+            if (trimmed.startsWith("[")) {
+                trimmed = trimmed.substring(1);
+            }
+            if (trimmed.endsWith("]")) {
+                trimmed = trimmed.substring(0, trimmed.length() - 1);
+            }
+            String[] parts = trimmed.split(",");
+            List<Float> result = new ArrayList<>(parts.length);
+            for (String part : parts) {
+                result.add(Float.parseFloat(part.trim()));
+            }
+            return result;
+        } catch (Exception e) {
+            log.error("向量字符串解析失败: {}", e.getMessage());
+            return null;
+        }
+    }
+}

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

@@ -4,10 +4,10 @@ import com.alibaba.fastjson.JSONArray;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import com.tzld.videoVector.common.constant.VectorConstants;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructVectorConfigMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.model.entity.VideoMatch;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample;
 import com.tzld.videoVector.service.VectorStoreService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,7 +39,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
  * </ul>
  */
 @Slf4j
-@Service
+//@Service  // 已替换为 PgVectorStoreServiceImpl
 public class RedisVectorStoreServiceImpl implements VectorStoreService {
 
 
@@ -514,7 +514,7 @@ public class RedisVectorStoreServiceImpl implements VectorStoreService {
         try {
             // 从数据库查询所有启用的配置
             DeconstructVectorConfigExample example = new DeconstructVectorConfigExample();
-            example.createCriteria().andEnabledEqualTo((byte) 1);
+            example.createCriteria().andEnabledEqualTo((short) 1);
             List<DeconstructVectorConfig> configs = vectorConfigMapper.selectByExample(example);
 
             for (DeconstructVectorConfig config : configs) {

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

@@ -3,9 +3,12 @@ package com.tzld.videoVector.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentVectorMapper;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructVectorConfigMapper;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.*;
+import com.tzld.videoVector.dao.mapper.pgVector.ContentVectorMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
+import com.tzld.videoVector.model.po.pgVector.ContentVector;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
 import com.tzld.videoVector.service.EmbeddingService;
 import com.tzld.videoVector.service.VectorizeService;
 import com.tzld.videoVector.util.Md5Util;
@@ -18,6 +21,7 @@ import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 向量化服务实现类
@@ -30,7 +34,7 @@ public class VectorizeServiceImpl implements VectorizeService {
     private DeconstructVectorConfigMapper vectorConfigMapper;
 
     @Resource
-    private DeconstructContentVectorMapper contentVectorMapper;
+    private ContentVectorMapper pgContentVectorMapper;
 
     @Resource
     private EmbeddingService embeddingService;
@@ -39,8 +43,8 @@ public class VectorizeServiceImpl implements VectorizeService {
     public List<DeconstructVectorConfig> getVectorConfigs(Integer bizType, Integer contentType) {
         // 使用 null-aware 查询:字段为 null(通用配置)和字段等于指定値的配置均可匹配
         return vectorConfigMapper.selectMatchingConfigs(
-                bizType != null ? bizType.byteValue() : null,
-                contentType != null ? contentType.byteValue() : null
+                bizType != null ? bizType.shortValue() : null,
+                contentType != null ? contentType.shortValue() : null
         );
     }
 
@@ -327,32 +331,23 @@ public class VectorizeServiceImpl implements VectorizeService {
 
     /**
      * 查询已缓存的向量数据(text_hash + config_code 联合匹配)
-     * 命中则返回向量浮点数列表,否则返回 null
+     * 优先查 pgvector,命中则返回向量浮点数列表,否则返回 null
      */
     private List<Float> findCachedVectorData(String textHash, String configCode) {
         if (!StringUtils.hasText(textHash) || !StringUtils.hasText(configCode)) {
             return null;
         }
         try {
-            DeconstructContentVectorExample example = new DeconstructContentVectorExample();
-            example.createCriteria()
-                    .andTextHashEqualTo(textHash)
-                    .andConfigCodeEqualTo(configCode);
-            example.setOrderByClause("id DESC");
-            List<DeconstructContentVector> cached = contentVectorMapper.selectByExampleWithBLOBs(example);
-            if (CollectionUtils.isEmpty(cached)) {
-                return null;
+            // 从 pgvector 查询
+            ContentVector cached = pgContentVectorMapper.selectByTextHashAndConfigCode(textHash, configCode);
+            if (cached != null && StringUtils.hasText(cached.getEmbedding())) {
+                return parseVectorString(cached.getEmbedding());
             }
-            String vectorDataJson = cached.get(0).getVectorData();
-            if (!StringUtils.hasText(vectorDataJson)) {
-                return null;
-            }
-            return JSON.parseArray(vectorDataJson, Float.class);
         } catch (Exception e) {
             log.error("查询 text_hash 向量缓存失败,hash={}, configCode={}, error={}",
                     textHash, configCode, e.getMessage());
-            return null;
         }
+        return null;
     }
 
     @Override
@@ -364,10 +359,25 @@ public class VectorizeServiceImpl implements VectorizeService {
         int count = 0;
         for (DeconstructContentVector vector : vectors) {
             try {
-                contentVectorMapper.insertSelective(vector);
+                // 存储到 pgvector
+                String embedding = vector.getVectorData();
+                // vectorData 是 JSON 数组格式 "[0.1,0.2,...]",pgvector 也接受这种格式
+                pgContentVectorMapper.upsertWithEmbedding(
+                        vector.getContentId(),
+                        vector.getTaskId(),
+                        vector.getConfigCode(),
+                        vector.getSourceField(),
+                        vector.getSourcePath(),
+                        vector.getTextHash(),
+                        vector.getEmbeddingModel(),
+                        vector.getSegmentIndex(),
+                        vector.getSegmentTotal(),
+                        vector.getSourceText(),
+                        embedding
+                );
                 count++;
             } catch (Exception e) {
-                log.error("保存向量失败,contentId={}, sourceField={}, error={}",
+                log.error("保存向量到pgvector失败,contentId={}, sourceField={}, error={}",
                         vector.getContentId(), vector.getSourceField(), e.getMessage());
             }
         }
@@ -376,35 +386,79 @@ public class VectorizeServiceImpl implements VectorizeService {
     }
 
     /**
-     * 根据 contentId 查询向量列表
+     * 根据 contentId 查询向量列表(从 pgvector 查询)
      */
     @Override
     public List<DeconstructContentVector> getVectorsByContentId(Long contentId) {
-        DeconstructContentVectorExample example = new DeconstructContentVectorExample();
-        example.createCriteria().andContentIdEqualTo(contentId);
-        example.setOrderByClause("source_field ASC, segment_index ASC");
-        return contentVectorMapper.selectByExampleWithBLOBs(example);
+        List<ContentVector> pgVectors = pgContentVectorMapper.selectByContentId(contentId);
+        return convertToDeconstructVectors(pgVectors);
     }
 
     @Override
     public List<DeconstructContentVector> getVectorsByContentId(Long contentId, String configCode) {
-        DeconstructContentVectorExample example = new DeconstructContentVectorExample();
-        DeconstructContentVectorExample.Criteria criteria = example.createCriteria()
-                .andContentIdEqualTo(contentId);
-        if (StringUtils.hasText(configCode)) {
-            criteria.andConfigCodeEqualTo(configCode);
-        }
-        example.setOrderByClause("source_field ASC, segment_index ASC");
-        return contentVectorMapper.selectByExampleWithBLOBs(example);
+        List<ContentVector> pgVectors = pgContentVectorMapper.selectByContentIdAndConfigCode(contentId, configCode);
+        return convertToDeconstructVectors(pgVectors);
     }
 
     @Override
     public List<DeconstructContentVector> getVectorsByField(Long contentId, String sourceField) {
-        DeconstructContentVectorExample example = new DeconstructContentVectorExample();
-        example.createCriteria()
-                .andContentIdEqualTo(contentId)
-                .andSourceFieldEqualTo(sourceField);
-        example.setOrderByClause("segment_index ASC");
-        return contentVectorMapper.selectByExampleWithBLOBs(example);
+        List<ContentVector> pgVectors = pgContentVectorMapper.selectByContentIdAndField(contentId, sourceField);
+        return convertToDeconstructVectors(pgVectors);
+    }
+
+    /**
+     * 将 pgvector ContentVector 转换为 DeconstructContentVector(兼容现有接口)
+     */
+    private List<DeconstructContentVector> convertToDeconstructVectors(List<ContentVector> pgVectors) {
+        if (CollectionUtils.isEmpty(pgVectors)) {
+            return new ArrayList<>();
+        }
+        return pgVectors.stream().map(pv -> {
+            DeconstructContentVector dcv = new DeconstructContentVector();
+            dcv.setId(pv.getId());
+            dcv.setContentId(pv.getContentId());
+            dcv.setTaskId(pv.getTaskId());
+            dcv.setConfigCode(pv.getConfigCode());
+            dcv.setSourceField(pv.getSourceField());
+            dcv.setSourcePath(pv.getSourcePath());
+            dcv.setTextHash(pv.getTextHash());
+            dcv.setEmbeddingModel(pv.getEmbeddingModel());
+            dcv.setSegmentIndex(pv.getSegmentIndex());
+            dcv.setSegmentTotal(pv.getSegmentTotal());
+            dcv.setSourceText(pv.getSourceText());
+            // 将 pgvector 格式的 embedding 转为 JSON 数组格式的 vectorData
+            if (StringUtils.hasText(pv.getEmbedding())) {
+                dcv.setVectorData(pv.getEmbedding());
+            }
+            dcv.setCreateTime(pv.getCreatedAt());
+            dcv.setUpdateTime(pv.getUpdatedAt());
+            return dcv;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * 解析 pgvector 字符串为 List<Float>
+     * 格式: "[0.1,0.2,...]" 或 pgvector 输出的 "[0.1,0.2,...]"
+     */
+    private List<Float> parseVectorString(String vectorStr) {
+        if (vectorStr == null || vectorStr.isEmpty()) return null;
+        try {
+            String trimmed = vectorStr.trim();
+            if (trimmed.startsWith("[")) {
+                trimmed = trimmed.substring(1);
+            }
+            if (trimmed.endsWith("]")) {
+                trimmed = trimmed.substring(0, trimmed.length() - 1);
+            }
+            String[] parts = trimmed.split(",");
+            List<Float> result = new ArrayList<>(parts.length);
+            for (String part : parts) {
+                result.add(Float.parseFloat(part.trim()));
+            }
+            return result;
+        } catch (Exception e) {
+            log.error("向量字符串解析失败: {}", e.getMessage());
+            return null;
+        }
     }
 }

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

@@ -2,21 +2,21 @@ package com.tzld.videoVector.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.videoVector.api.VideoApiService;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentMapper;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentVectorMapper;
-import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructVectorConfigMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ContentVectorMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.model.entity.DeconstructResult;
 import com.tzld.videoVector.model.entity.VideoDetail;
 import com.tzld.videoVector.model.entity.VideoMatch;
 import com.tzld.videoVector.model.param.DeconstructParam;
 import com.tzld.videoVector.model.param.GetDeconstructParam;
 import com.tzld.videoVector.model.param.MatchTopNVideoParam;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample;
+import com.tzld.videoVector.model.po.pgVector.ContentVector;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContent;
+import com.tzld.videoVector.model.po.pgVector.DeconstructContentExample;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample;
 import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVectorExample;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
-import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample;
 import com.tzld.videoVector.common.constant.VectorConstants;
 import com.tzld.videoVector.service.*;
 import com.tzld.videoVector.util.Md5Util;
@@ -48,7 +48,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     private DeconstructContentMapper deconstructContentMapper;
 
     @Resource
-    private DeconstructContentVectorMapper deconstructContentVectorMapper;
+    private ContentVectorMapper pgContentVectorMapper;
 
     @Resource
     private VectorizeService vectorizeService;
@@ -88,7 +88,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         if (StringUtils.hasText(channelContentId)) {
             DeconstructContent existingContent = getDeconstructContentByChannelContentId(channelContentId);
             if (existingContent != null) {
-                Byte status = existingContent.getStatus();
+                Short status = existingContent.getStatus();
                 // 状态: 0-PENDING, 1-RUNNING, 2-SUCCESS, 3-FAILED
                 // 如果状态为 PENDING、RUNNING 或 SUCCESS,不重复提交,直接返回已有 taskId
                 if (status != null && status != 3) {
@@ -132,14 +132,14 @@ public class VideoSearchServiceImpl implements VideoSearchService {
             if (failedContent != null) {
                 // 历史存在失败记录,更新该记录,不新增
                 failedContent.setTaskId(taskId);
-                failedContent.setBizType(bizType.byteValue());
-                failedContent.setContentType(contentType.byteValue());
+                failedContent.setBizType(bizType.shortValue());
+                failedContent.setContentType(contentType.shortValue());
                 failedContent.setTitle(param.getTitle());
                 failedContent.setBodyText(param.getBodyText());
                 failedContent.setVideoUrl(param.getVideoUrl());
                 failedContent.setChannelAccountId(param.getChannelAccountId());
                 failedContent.setChannelAccountName(param.getChannelAccountName());
-                failedContent.setStatus((byte) 0); // PENDING
+                failedContent.setStatus((short) 0); // PENDING
                 // 清除历史失败信息(使用空字符串确保 selective update 生效)
                 failedContent.setResultJson("");
                 failedContent.setFailureReason("");
@@ -156,15 +156,15 @@ public class VideoSearchServiceImpl implements VideoSearchService {
             } else {
                 DeconstructContent content = new DeconstructContent();
                 content.setTaskId(taskId);
-                content.setBizType(bizType.byteValue());
-                content.setContentType(contentType.byteValue());
+                content.setBizType(bizType.shortValue());
+                content.setContentType(contentType.shortValue());
                 content.setChannelContentId(param.getChannelContentId());
                 content.setTitle(param.getTitle());
                 content.setBodyText(param.getBodyText());
                 content.setVideoUrl(param.getVideoUrl());
                 content.setChannelAccountId(param.getChannelAccountId());
                 content.setChannelAccountName(param.getChannelAccountName());
-                content.setStatus((byte) 0); // PENDING
+                content.setStatus((short) 0); // PENDING
                 content.setCreateTime(new Date());
                 content.setUpdateTime(new Date());
                 // 处理图片列表
@@ -248,7 +248,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     private DeconstructContent getDeconstructContentByTaskId(String taskId) {
         DeconstructContentExample example = new DeconstructContentExample();
         example.createCriteria().andTaskIdEqualTo(taskId);
-        List<DeconstructContent> list = deconstructContentMapper.selectByExampleWithBLOBs(example);
+        List<DeconstructContent> list = deconstructContentMapper.selectByExample(example);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -275,14 +275,14 @@ public class VideoSearchServiceImpl implements VideoSearchService {
                 // 创建新记录
                 content = new DeconstructContent();
                 content.setTaskId(taskId);
-                content.setBizType(param.getBizType() != null ? param.getBizType().byteValue() : 0);
-                content.setContentType(param.getContentType() != null ? param.getContentType().byteValue() : 2);
+                content.setBizType(param.getBizType() != null ? param.getBizType().shortValue() : 0);
+                content.setContentType(param.getContentType() != null ? param.getContentType().shortValue() : 2);
                 content.setChannelContentId(param.getChannelContentId());
                 content.setCreateTime(new Date());
             }
 
             // 更新状态和结果
-            content.setStatus(result.getStatus() != null ? result.getStatus().byteValue() : (byte) 3);
+            content.setStatus(result.getStatus() != null ? result.getStatus().shortValue() : (short) 3);
             content.setResultJson(result.getResult());
             content.setFailureReason(result.getReason());
             content.setPointUrl(result.getPointUrl());
@@ -384,7 +384,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     /**
      * 获取状态描述
      */
-    private String getStatusDesc(Byte status) {
+    private String getStatusDesc(Short status) {
         if (status == null) return "UNKNOWN";
         switch (status) {
             case 0: return "PENDING";
@@ -404,7 +404,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
             DeconstructContentExample example = new DeconstructContentExample();
             example.createCriteria().andChannelContentIdEqualTo(channelContentId);
             example.setOrderByClause("id DESC");
-            List<DeconstructContent> list = deconstructContentMapper.selectByExampleWithBLOBs(example);
+            List<DeconstructContent> list = deconstructContentMapper.selectByExample(example);
             if (list == null || list.isEmpty()) {
                 log.debug("triggerVectorizeIfNeeded: 未找到 channelContentId={} 的解构记录", channelContentId);
                 return;
@@ -653,7 +653,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     private List<DeconstructVectorConfig> getEnabledConfigs() {
         try {
             DeconstructVectorConfigExample example = new DeconstructVectorConfigExample();
-            example.createCriteria().andEnabledEqualTo((byte) 1);
+            example.createCriteria().andEnabledEqualTo((short) 1);
             example.setOrderByClause("priority ASC");
             List<DeconstructVectorConfig> configs = deconstructVectorConfigMapper.selectByExample(example);
             return configs != null ? configs : Collections.emptyList();
@@ -732,27 +732,46 @@ public class VideoSearchServiceImpl implements VideoSearchService {
 
     /**
      * 通过 text_hash 查询历史 embedding 结果,命中则跳过 embedding API 调用
+     * 优先从 pgvector 查询
      */
     private List<Float> getVectorByTextHash(String textHash, String configCode) {
         try {
-            DeconstructContentVectorExample example = new DeconstructContentVectorExample();
-            DeconstructContentVectorExample.Criteria criteria = example.createCriteria()
-                    .andTextHashEqualTo(textHash);
+            ContentVector cached;
             if (StringUtils.hasText(configCode)) {
-                criteria.andConfigCodeEqualTo(configCode);
-            }
-            example.setOrderByClause("id DESC");
-            List<DeconstructContentVector> vectors = deconstructContentVectorMapper.selectByExampleWithBLOBs(example);
-            if (vectors == null || vectors.isEmpty()) {
-                return null;
+                cached = pgContentVectorMapper.selectByTextHashAndConfigCode(textHash, configCode);
+            } else {
+                cached = pgContentVectorMapper.selectByTextHash(textHash);
             }
-            String vectorDataJson = vectors.get(0).getVectorData();
-            if (!StringUtils.hasText(vectorDataJson)) {
-                return null;
+            if (cached != null && StringUtils.hasText(cached.getEmbedding())) {
+                return parseVectorString(cached.getEmbedding());
             }
-            return com.alibaba.fastjson.JSON.parseArray(vectorDataJson, Float.class);
         } catch (Exception e) {
             log.error("按 text_hash 查询向量失败,hash={}, configCode={}, error={}", textHash, configCode, e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 解析 pgvector 字符串为 List<Float>
+     */
+    private List<Float> parseVectorString(String vectorStr) {
+        if (vectorStr == null || vectorStr.isEmpty()) return null;
+        try {
+            String trimmed = vectorStr.trim();
+            if (trimmed.startsWith("[")) {
+                trimmed = trimmed.substring(1);
+            }
+            if (trimmed.endsWith("]")) {
+                trimmed = trimmed.substring(0, trimmed.length() - 1);
+            }
+            String[] parts = trimmed.split(",");
+            List<Float> result = new ArrayList<>(parts.length);
+            for (String part : parts) {
+                result.add(Float.parseFloat(part.trim()));
+            }
+            return result;
+        } catch (Exception e) {
+            log.error("向量字符串解析失败: {}", e.getMessage());
             return null;
         }
     }

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

@@ -52,11 +52,28 @@
             <property name="enableSubPackages" value="true"/>
         </javaClientGenerator>
 
-        <!-- 向量主表(embedding 列类型 MBG 不识别,生成后需手动调整) -->
-        <table tableName="video_vectors" domainObjectName="VideoVector" alias="">
+        <!-- 视频向量主表(embedding 列类型 MBG 不识别,生成后需手动调整) -->
+<!--        <table tableName="video_vectors" domainObjectName="VideoVector" alias="">-->
+<!--            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>-->
+<!--            &lt;!&ndash; pgvector 的 vector 类型 MBG 无法自动映射,忽略后手动补充 &ndash;&gt;-->
+<!--            <ignoreColumn column="embedding"/>-->
+<!--        </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"/>-->
+<!--        </table>-->
+
+        <!-- 内容解构主表 -->
+        <table tableName="deconstruct_content" domainObjectName="DeconstructContent" alias="">
+            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
+        </table>
+
+        <!-- 向量化字段配置表 -->
+        <table tableName="deconstruct_vector_config" domainObjectName="DeconstructVectorConfig" alias="">
             <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
-            <!-- pgvector 的 vector 类型 MBG 无法自动映射,忽略后手动补充 -->
-            <ignoreColumn column="embedding"/>
         </table>
     </context>
 

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

@@ -0,0 +1,509 @@
+<?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.ContentVectorMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.pgVector.ContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    <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="created_at" jdbcType="TIMESTAMP" property="createdAt" />
+    <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
+  </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 15:27:37 CST 2026.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_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 15:27:37 CST 2026.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    id, content_id, task_id, config_code, source_field, source_path, text_hash, embedding_model, 
+    segment_index, segment_total, source_text, created_at, updated_at
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVectorExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from content_vectors
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from content_vectors
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="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 15:27:37 CST 2026.
+    -->
+    delete from content_vectors
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVectorExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    delete from content_vectors
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVector" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    insert into content_vectors (content_id, task_id, config_code, 
+      source_field, source_path, text_hash, 
+      embedding_model, segment_index, segment_total, 
+      source_text, created_at, updated_at
+      )
+    values (#{contentId,jdbcType=BIGINT}, #{taskId,jdbcType=VARCHAR}, #{configCode,jdbcType=VARCHAR}, 
+      #{sourceField,jdbcType=VARCHAR}, #{sourcePath,jdbcType=VARCHAR}, #{textHash,jdbcType=VARCHAR}, 
+      #{embeddingModel,jdbcType=VARCHAR}, #{segmentIndex,jdbcType=INTEGER}, #{segmentTotal,jdbcType=INTEGER}, 
+      #{sourceText,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVector" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    insert into content_vectors
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="contentId != null">
+        content_id,
+      </if>
+      <if test="taskId != null">
+        task_id,
+      </if>
+      <if test="configCode != null">
+        config_code,
+      </if>
+      <if test="sourceField != null">
+        source_field,
+      </if>
+      <if test="sourcePath != null">
+        source_path,
+      </if>
+      <if test="textHash != null">
+        text_hash,
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model,
+      </if>
+      <if test="segmentIndex != null">
+        segment_index,
+      </if>
+      <if test="segmentTotal != null">
+        segment_total,
+      </if>
+      <if test="sourceText != null">
+        source_text,
+      </if>
+      <if test="createdAt != null">
+        created_at,
+      </if>
+      <if test="updatedAt != null">
+        updated_at,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="contentId != null">
+        #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="taskId != null">
+        #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="configCode != null">
+        #{configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="sourceField != null">
+        #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="textHash != null">
+        #{textHash,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="segmentIndex != null">
+        #{segmentIndex,jdbcType=INTEGER},
+      </if>
+      <if test="segmentTotal != null">
+        #{segmentTotal,jdbcType=INTEGER},
+      </if>
+      <if test="sourceText != null">
+        #{sourceText,jdbcType=VARCHAR},
+      </if>
+      <if test="createdAt != null">
+        #{createdAt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updatedAt != null">
+        #{updatedAt,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVectorExample" 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 15:27:37 CST 2026.
+    -->
+    select count(*) from content_vectors
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    update content_vectors
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.contentId != null">
+        content_id = #{record.contentId,jdbcType=BIGINT},
+      </if>
+      <if test="record.taskId != null">
+        task_id = #{record.taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.configCode != null">
+        config_code = #{record.configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourceField != null">
+        source_field = #{record.sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourcePath != null">
+        source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="record.textHash != null">
+        text_hash = #{record.textHash,jdbcType=VARCHAR},
+      </if>
+      <if test="record.embeddingModel != null">
+        embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="record.segmentIndex != null">
+        segment_index = #{record.segmentIndex,jdbcType=INTEGER},
+      </if>
+      <if test="record.segmentTotal != null">
+        segment_total = #{record.segmentTotal,jdbcType=INTEGER},
+      </if>
+      <if test="record.sourceText != null">
+        source_text = #{record.sourceText,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createdAt != null">
+        created_at = #{record.createdAt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updatedAt != null">
+        updated_at = #{record.updatedAt,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    update content_vectors
+    set id = #{record.id,jdbcType=BIGINT},
+      content_id = #{record.contentId,jdbcType=BIGINT},
+      task_id = #{record.taskId,jdbcType=VARCHAR},
+      config_code = #{record.configCode,jdbcType=VARCHAR},
+      source_field = #{record.sourceField,jdbcType=VARCHAR},
+      source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      text_hash = #{record.textHash,jdbcType=VARCHAR},
+      embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      segment_index = #{record.segmentIndex,jdbcType=INTEGER},
+      segment_total = #{record.segmentTotal,jdbcType=INTEGER},
+      source_text = #{record.sourceText,jdbcType=VARCHAR},
+      created_at = #{record.createdAt,jdbcType=TIMESTAMP},
+      updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    update content_vectors
+    <set>
+      <if test="contentId != null">
+        content_id = #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="taskId != null">
+        task_id = #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="configCode != null">
+        config_code = #{configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="sourceField != null">
+        source_field = #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        source_path = #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="textHash != null">
+        text_hash = #{textHash,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="segmentIndex != null">
+        segment_index = #{segmentIndex,jdbcType=INTEGER},
+      </if>
+      <if test="segmentTotal != null">
+        segment_total = #{segmentTotal,jdbcType=INTEGER},
+      </if>
+      <if test="sourceText != null">
+        source_text = #{sourceText,jdbcType=VARCHAR},
+      </if>
+      <if test="createdAt != null">
+        created_at = #{createdAt,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updatedAt != null">
+        updated_at = #{updatedAt,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.videoVector.model.po.pgVector.ContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:27:37 CST 2026.
+    -->
+    update content_vectors
+    set content_id = #{contentId,jdbcType=BIGINT},
+      task_id = #{taskId,jdbcType=VARCHAR},
+      config_code = #{configCode,jdbcType=VARCHAR},
+      source_field = #{sourceField,jdbcType=VARCHAR},
+      source_path = #{sourcePath,jdbcType=VARCHAR},
+      text_hash = #{textHash,jdbcType=VARCHAR},
+      embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      segment_index = #{segmentIndex,jdbcType=INTEGER},
+      segment_total = #{segmentTotal,jdbcType=INTEGER},
+      source_text = #{sourceText,jdbcType=VARCHAR},
+      created_at = #{createdAt,jdbcType=TIMESTAMP},
+      updated_at = #{updatedAt,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </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>

+ 502 - 0
core/src/main/resources/mapper/pgVector/DeconstructContentMapper.xml

@@ -0,0 +1,502 @@
+<?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.DeconstructContentMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.pgVector.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="task_id" jdbcType="VARCHAR" property="taskId" />
+    <result column="biz_type" jdbcType="SMALLINT" property="bizType" />
+    <result column="content_type" jdbcType="SMALLINT" property="contentType" />
+    <result column="channel_content_id" jdbcType="VARCHAR" property="channelContentId" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="body_text" jdbcType="VARCHAR" property="bodyText" />
+    <result column="video_url" jdbcType="VARCHAR" property="videoUrl" />
+    <result column="images" jdbcType="VARCHAR" property="images" />
+    <result column="channel_account_id" jdbcType="VARCHAR" property="channelAccountId" />
+    <result column="channel_account_name" jdbcType="VARCHAR" property="channelAccountName" />
+    <result column="status" jdbcType="SMALLINT" property="status" />
+    <result column="result_json" jdbcType="VARCHAR" property="resultJson" />
+    <result column="failure_reason" jdbcType="VARCHAR" property="failureReason" />
+    <result column="point_url" jdbcType="VARCHAR" property="pointUrl" />
+    <result column="weight_url" jdbcType="VARCHAR" property="weightUrl" />
+    <result column="pattern_url" jdbcType="VARCHAR" property="patternUrl" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+  </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 15:35:34 CST 2026.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_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 15:35:34 CST 2026.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    id, task_id, biz_type, content_type, channel_content_id, title, body_text, video_url, 
+    images, channel_account_id, channel_account_name, "status", result_json, failure_reason, 
+    point_url, weight_url, pattern_url, create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContentExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from deconstruct_content
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from deconstruct_content
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="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 15:35:34 CST 2026.
+    -->
+    delete from deconstruct_content
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContentExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    delete from deconstruct_content
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContent" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    insert into deconstruct_content (task_id, biz_type, content_type, 
+      channel_content_id, title, body_text, 
+      video_url, images, channel_account_id, 
+      channel_account_name, "status", result_json, 
+      failure_reason, point_url, weight_url, 
+      pattern_url, create_time, update_time
+      )
+    values (#{taskId,jdbcType=VARCHAR}, #{bizType,jdbcType=SMALLINT}, #{contentType,jdbcType=SMALLINT}, 
+      #{channelContentId,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR}, #{bodyText,jdbcType=VARCHAR}, 
+      #{videoUrl,jdbcType=VARCHAR}, #{images,jdbcType=VARCHAR}, #{channelAccountId,jdbcType=VARCHAR}, 
+      #{channelAccountName,jdbcType=VARCHAR}, #{status,jdbcType=SMALLINT}, #{resultJson,jdbcType=VARCHAR}, 
+      #{failureReason,jdbcType=VARCHAR}, #{pointUrl,jdbcType=VARCHAR}, #{weightUrl,jdbcType=VARCHAR}, 
+      #{patternUrl,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContent" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    insert into deconstruct_content
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="taskId != null">
+        task_id,
+      </if>
+      <if test="bizType != null">
+        biz_type,
+      </if>
+      <if test="contentType != null">
+        content_type,
+      </if>
+      <if test="channelContentId != null">
+        channel_content_id,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="bodyText != null">
+        body_text,
+      </if>
+      <if test="videoUrl != null">
+        video_url,
+      </if>
+      <if test="images != null">
+        images,
+      </if>
+      <if test="channelAccountId != null">
+        channel_account_id,
+      </if>
+      <if test="channelAccountName != null">
+        channel_account_name,
+      </if>
+      <if test="status != null">
+        "status",
+      </if>
+      <if test="resultJson != null">
+        result_json,
+      </if>
+      <if test="failureReason != null">
+        failure_reason,
+      </if>
+      <if test="pointUrl != null">
+        point_url,
+      </if>
+      <if test="weightUrl != null">
+        weight_url,
+      </if>
+      <if test="patternUrl != null">
+        pattern_url,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="taskId != null">
+        #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        #{bizType,jdbcType=SMALLINT},
+      </if>
+      <if test="contentType != null">
+        #{contentType,jdbcType=SMALLINT},
+      </if>
+      <if test="channelContentId != null">
+        #{channelContentId,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="bodyText != null">
+        #{bodyText,jdbcType=VARCHAR},
+      </if>
+      <if test="videoUrl != null">
+        #{videoUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="images != null">
+        #{images,jdbcType=VARCHAR},
+      </if>
+      <if test="channelAccountId != null">
+        #{channelAccountId,jdbcType=VARCHAR},
+      </if>
+      <if test="channelAccountName != null">
+        #{channelAccountName,jdbcType=VARCHAR},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=SMALLINT},
+      </if>
+      <if test="resultJson != null">
+        #{resultJson,jdbcType=VARCHAR},
+      </if>
+      <if test="failureReason != null">
+        #{failureReason,jdbcType=VARCHAR},
+      </if>
+      <if test="pointUrl != null">
+        #{pointUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="weightUrl != null">
+        #{weightUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="patternUrl != null">
+        #{patternUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContentExample" 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 15:35:34 CST 2026.
+    -->
+    select count(*) from deconstruct_content
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_content
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.taskId != null">
+        task_id = #{record.taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.bizType != null">
+        biz_type = #{record.bizType,jdbcType=SMALLINT},
+      </if>
+      <if test="record.contentType != null">
+        content_type = #{record.contentType,jdbcType=SMALLINT},
+      </if>
+      <if test="record.channelContentId != null">
+        channel_content_id = #{record.channelContentId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.bodyText != null">
+        body_text = #{record.bodyText,jdbcType=VARCHAR},
+      </if>
+      <if test="record.videoUrl != null">
+        video_url = #{record.videoUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.images != null">
+        images = #{record.images,jdbcType=VARCHAR},
+      </if>
+      <if test="record.channelAccountId != null">
+        channel_account_id = #{record.channelAccountId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.channelAccountName != null">
+        channel_account_name = #{record.channelAccountName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.status != null">
+        "status" = #{record.status,jdbcType=SMALLINT},
+      </if>
+      <if test="record.resultJson != null">
+        result_json = #{record.resultJson,jdbcType=VARCHAR},
+      </if>
+      <if test="record.failureReason != null">
+        failure_reason = #{record.failureReason,jdbcType=VARCHAR},
+      </if>
+      <if test="record.pointUrl != null">
+        point_url = #{record.pointUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.weightUrl != null">
+        weight_url = #{record.weightUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.patternUrl != null">
+        pattern_url = #{record.patternUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_content
+    set id = #{record.id,jdbcType=BIGINT},
+      task_id = #{record.taskId,jdbcType=VARCHAR},
+      biz_type = #{record.bizType,jdbcType=SMALLINT},
+      content_type = #{record.contentType,jdbcType=SMALLINT},
+      channel_content_id = #{record.channelContentId,jdbcType=VARCHAR},
+      title = #{record.title,jdbcType=VARCHAR},
+      body_text = #{record.bodyText,jdbcType=VARCHAR},
+      video_url = #{record.videoUrl,jdbcType=VARCHAR},
+      images = #{record.images,jdbcType=VARCHAR},
+      channel_account_id = #{record.channelAccountId,jdbcType=VARCHAR},
+      channel_account_name = #{record.channelAccountName,jdbcType=VARCHAR},
+      "status" = #{record.status,jdbcType=SMALLINT},
+      result_json = #{record.resultJson,jdbcType=VARCHAR},
+      failure_reason = #{record.failureReason,jdbcType=VARCHAR},
+      point_url = #{record.pointUrl,jdbcType=VARCHAR},
+      weight_url = #{record.weightUrl,jdbcType=VARCHAR},
+      pattern_url = #{record.patternUrl,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_content
+    <set>
+      <if test="taskId != null">
+        task_id = #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        biz_type = #{bizType,jdbcType=SMALLINT},
+      </if>
+      <if test="contentType != null">
+        content_type = #{contentType,jdbcType=SMALLINT},
+      </if>
+      <if test="channelContentId != null">
+        channel_content_id = #{channelContentId,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="bodyText != null">
+        body_text = #{bodyText,jdbcType=VARCHAR},
+      </if>
+      <if test="videoUrl != null">
+        video_url = #{videoUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="images != null">
+        images = #{images,jdbcType=VARCHAR},
+      </if>
+      <if test="channelAccountId != null">
+        channel_account_id = #{channelAccountId,jdbcType=VARCHAR},
+      </if>
+      <if test="channelAccountName != null">
+        channel_account_name = #{channelAccountName,jdbcType=VARCHAR},
+      </if>
+      <if test="status != null">
+        "status" = #{status,jdbcType=SMALLINT},
+      </if>
+      <if test="resultJson != null">
+        result_json = #{resultJson,jdbcType=VARCHAR},
+      </if>
+      <if test="failureReason != null">
+        failure_reason = #{failureReason,jdbcType=VARCHAR},
+      </if>
+      <if test="pointUrl != null">
+        point_url = #{pointUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="weightUrl != null">
+        weight_url = #{weightUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="patternUrl != null">
+        pattern_url = #{patternUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_content
+    set task_id = #{taskId,jdbcType=VARCHAR},
+      biz_type = #{bizType,jdbcType=SMALLINT},
+      content_type = #{contentType,jdbcType=SMALLINT},
+      channel_content_id = #{channelContentId,jdbcType=VARCHAR},
+      title = #{title,jdbcType=VARCHAR},
+      body_text = #{bodyText,jdbcType=VARCHAR},
+      video_url = #{videoUrl,jdbcType=VARCHAR},
+      images = #{images,jdbcType=VARCHAR},
+      channel_account_id = #{channelAccountId,jdbcType=VARCHAR},
+      channel_account_name = #{channelAccountName,jdbcType=VARCHAR},
+      "status" = #{status,jdbcType=SMALLINT},
+      result_json = #{resultJson,jdbcType=VARCHAR},
+      failure_reason = #{failureReason,jdbcType=VARCHAR},
+      point_url = #{pointUrl,jdbcType=VARCHAR},
+      weight_url = #{weightUrl,jdbcType=VARCHAR},
+      pattern_url = #{patternUrl,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

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

@@ -0,0 +1,485 @@
+<?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.DeconstructVectorConfigMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="config_code" jdbcType="VARCHAR" property="configCode" />
+    <result column="config_name" jdbcType="VARCHAR" property="configName" />
+    <result column="biz_type" jdbcType="SMALLINT" property="bizType" />
+    <result column="content_type" jdbcType="SMALLINT" property="contentType" />
+    <result column="source_field" jdbcType="VARCHAR" property="sourceField" />
+    <result column="source_path" jdbcType="VARCHAR" property="sourcePath" />
+    <result column="extract_rule" jdbcType="VARCHAR" property="extractRule" />
+    <result column="embedding_model" jdbcType="VARCHAR" property="embeddingModel" />
+    <result column="dimension" jdbcType="INTEGER" property="dimension" />
+    <result column="max_length" jdbcType="INTEGER" property="maxLength" />
+    <result column="enable_segment" jdbcType="SMALLINT" property="enableSegment" />
+    <result column="segment_size" jdbcType="INTEGER" property="segmentSize" />
+    <result column="priority" jdbcType="INTEGER" property="priority" />
+    <result column="enabled" jdbcType="SMALLINT" property="enabled" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+  </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 15:35:34 CST 2026.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_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 15:35:34 CST 2026.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    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="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from deconstruct_vector_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from deconstruct_vector_config
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="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 15:35:34 CST 2026.
+    -->
+    delete from deconstruct_vector_config
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    delete from deconstruct_vector_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    insert into deconstruct_vector_config (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)
+    values (#{configCode,jdbcType=VARCHAR}, #{configName,jdbcType=VARCHAR}, #{bizType,jdbcType=SMALLINT}, 
+      #{contentType,jdbcType=SMALLINT}, #{sourceField,jdbcType=VARCHAR}, #{sourcePath,jdbcType=VARCHAR}, 
+      #{extractRule,jdbcType=VARCHAR}, #{embeddingModel,jdbcType=VARCHAR}, #{dimension,jdbcType=INTEGER}, 
+      #{maxLength,jdbcType=INTEGER}, #{enableSegment,jdbcType=SMALLINT}, #{segmentSize,jdbcType=INTEGER}, 
+      #{priority,jdbcType=INTEGER}, #{enabled,jdbcType=SMALLINT}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateTime,jdbcType=TIMESTAMP})
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    insert into deconstruct_vector_config
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="configCode != null">
+        config_code,
+      </if>
+      <if test="configName != null">
+        config_name,
+      </if>
+      <if test="bizType != null">
+        biz_type,
+      </if>
+      <if test="contentType != null">
+        content_type,
+      </if>
+      <if test="sourceField != null">
+        source_field,
+      </if>
+      <if test="sourcePath != null">
+        source_path,
+      </if>
+      <if test="extractRule != null">
+        extract_rule,
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model,
+      </if>
+      <if test="dimension != null">
+        dimension,
+      </if>
+      <if test="maxLength != null">
+        max_length,
+      </if>
+      <if test="enableSegment != null">
+        enable_segment,
+      </if>
+      <if test="segmentSize != null">
+        segment_size,
+      </if>
+      <if test="priority != null">
+        priority,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="configCode != null">
+        #{configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="configName != null">
+        #{configName,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        #{bizType,jdbcType=SMALLINT},
+      </if>
+      <if test="contentType != null">
+        #{contentType,jdbcType=SMALLINT},
+      </if>
+      <if test="sourceField != null">
+        #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="extractRule != null">
+        #{extractRule,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="dimension != null">
+        #{dimension,jdbcType=INTEGER},
+      </if>
+      <if test="maxLength != null">
+        #{maxLength,jdbcType=INTEGER},
+      </if>
+      <if test="enableSegment != null">
+        #{enableSegment,jdbcType=SMALLINT},
+      </if>
+      <if test="segmentSize != null">
+        #{segmentSize,jdbcType=INTEGER},
+      </if>
+      <if test="priority != null">
+        #{priority,jdbcType=INTEGER},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=SMALLINT},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfigExample" 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 15:35:34 CST 2026.
+    -->
+    select count(*) from deconstruct_vector_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_vector_config
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.configCode != null">
+        config_code = #{record.configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.configName != null">
+        config_name = #{record.configName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.bizType != null">
+        biz_type = #{record.bizType,jdbcType=SMALLINT},
+      </if>
+      <if test="record.contentType != null">
+        content_type = #{record.contentType,jdbcType=SMALLINT},
+      </if>
+      <if test="record.sourceField != null">
+        source_field = #{record.sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourcePath != null">
+        source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="record.extractRule != null">
+        extract_rule = #{record.extractRule,jdbcType=VARCHAR},
+      </if>
+      <if test="record.embeddingModel != null">
+        embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="record.dimension != null">
+        dimension = #{record.dimension,jdbcType=INTEGER},
+      </if>
+      <if test="record.maxLength != null">
+        max_length = #{record.maxLength,jdbcType=INTEGER},
+      </if>
+      <if test="record.enableSegment != null">
+        enable_segment = #{record.enableSegment,jdbcType=SMALLINT},
+      </if>
+      <if test="record.segmentSize != null">
+        segment_size = #{record.segmentSize,jdbcType=INTEGER},
+      </if>
+      <if test="record.priority != null">
+        priority = #{record.priority,jdbcType=INTEGER},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=SMALLINT},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_vector_config
+    set id = #{record.id,jdbcType=BIGINT},
+      config_code = #{record.configCode,jdbcType=VARCHAR},
+      config_name = #{record.configName,jdbcType=VARCHAR},
+      biz_type = #{record.bizType,jdbcType=SMALLINT},
+      content_type = #{record.contentType,jdbcType=SMALLINT},
+      source_field = #{record.sourceField,jdbcType=VARCHAR},
+      source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      extract_rule = #{record.extractRule,jdbcType=VARCHAR},
+      embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      dimension = #{record.dimension,jdbcType=INTEGER},
+      max_length = #{record.maxLength,jdbcType=INTEGER},
+      enable_segment = #{record.enableSegment,jdbcType=SMALLINT},
+      segment_size = #{record.segmentSize,jdbcType=INTEGER},
+      priority = #{record.priority,jdbcType=INTEGER},
+      enabled = #{record.enabled,jdbcType=SMALLINT},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_vector_config
+    <set>
+      <if test="configCode != null">
+        config_code = #{configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="configName != null">
+        config_name = #{configName,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        biz_type = #{bizType,jdbcType=SMALLINT},
+      </if>
+      <if test="contentType != null">
+        content_type = #{contentType,jdbcType=SMALLINT},
+      </if>
+      <if test="sourceField != null">
+        source_field = #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        source_path = #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="extractRule != null">
+        extract_rule = #{extractRule,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="dimension != null">
+        dimension = #{dimension,jdbcType=INTEGER},
+      </if>
+      <if test="maxLength != null">
+        max_length = #{maxLength,jdbcType=INTEGER},
+      </if>
+      <if test="enableSegment != null">
+        enable_segment = #{enableSegment,jdbcType=SMALLINT},
+      </if>
+      <if test="segmentSize != null">
+        segment_size = #{segmentSize,jdbcType=INTEGER},
+      </if>
+      <if test="priority != null">
+        priority = #{priority,jdbcType=INTEGER},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=SMALLINT},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.videoVector.model.po.pgVector.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Wed Apr 29 15:35:34 CST 2026.
+    -->
+    update deconstruct_vector_config
+    set config_code = #{configCode,jdbcType=VARCHAR},
+      config_name = #{configName,jdbcType=VARCHAR},
+      biz_type = #{bizType,jdbcType=SMALLINT},
+      content_type = #{contentType,jdbcType=SMALLINT},
+      source_field = #{sourceField,jdbcType=VARCHAR},
+      source_path = #{sourcePath,jdbcType=VARCHAR},
+      extract_rule = #{extractRule,jdbcType=VARCHAR},
+      embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      dimension = #{dimension,jdbcType=INTEGER},
+      max_length = #{maxLength,jdbcType=INTEGER},
+      enable_segment = #{enableSegment,jdbcType=SMALLINT},
+      segment_size = #{segmentSize,jdbcType=INTEGER},
+      priority = #{priority,jdbcType=INTEGER},
+      enabled = #{enabled,jdbcType=SMALLINT},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </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>

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

@@ -277,4 +277,93 @@
       updated_at = #{updatedAt,jdbcType=TIMESTAMP}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+  <!-- ==================== 自定义向量操作 SQL ==================== -->
+
+  <!-- Upsert: 插入或更新向量 -->
+  <insert id="upsertVector">
+    INSERT INTO video_vectors (video_id, config_code, embedding, created_at, updated_at)
+    VALUES (#{videoId}, #{configCode}, #{embedding}::vector, NOW(), NOW())
+    ON CONFLICT (video_id, config_code)
+    DO UPDATE SET embedding = EXCLUDED.embedding, updated_at = NOW()
+  </insert>
+
+  <!-- 判断是否存在 -->
+  <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 video_id FROM video_vectors
+    WHERE config_code = #{configCode}
+    AND video_id IN
+    <foreach collection="videoIds" item="vid" open="(" separator="," close=")">
+      #{vid}
+    </foreach>
+  </select>
+
+  <!-- 获取单个向量 -->
+  <select id="selectEmbeddingByVideoIdAndConfigCode" resultType="java.lang.String">
+    SELECT embedding::text FROM video_vectors
+    WHERE video_id = #{videoId} AND config_code = #{configCode}
+  </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="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, 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 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 -->
+  <resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
+    <result column="video_id" jdbcType="BIGINT" property="videoId" />
+    <result column="score" jdbcType="DOUBLE" property="score" />
+  </resultMap>
+
+  <select id="searchTopNByCosine" resultMap="SearchResultMap">
+    SELECT video_id, 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>