Procházet zdrojové kódy

按来源文章ID查询匹配的视频

wangyunpeng před 14 hodinami
rodič
revize
77b13da969

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

@@ -24,4 +24,9 @@ public interface VideoArticleMatchResultMapperExt {
      * 查询表中最大的 dt 值
      */
     String selectMaxDt();
+
+    /**
+     * 查询包含指定来源文章ID的最大 dt 值
+     */
+    String selectMaxDtBySourceId(@Param("accountName") String accountName, @Param("sourceId") String sourceId);
 }

+ 20 - 0
core/src/main/java/com/tzld/videoVector/model/param/VideoArticleMatchBySourceParam.java

@@ -0,0 +1,20 @@
+package com.tzld.videoVector.model.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 按来源文章ID查询匹配视频
+ */
+@Data
+public class VideoArticleMatchBySourceParam {
+    /** 账号(account),必传 */
+    @NotBlank(message = "account 不能为空")
+    private String account;
+    /** 匹配到的文章ID(matched_article_id),必传 */
+    @NotBlank(message = "sourceId 不能为空")
+    private String sourceId;
+    /** 返回结果数量,不传默认10 */
+    private Integer topN = 10;
+}

+ 12 - 0
core/src/main/java/com/tzld/videoVector/service/VideoArticleMatchService.java

@@ -1,9 +1,12 @@
 package com.tzld.videoVector.service;
 
+import com.tzld.videoVector.model.param.VideoArticleMatchBySourceParam;
 import com.tzld.videoVector.model.param.VideoArticleMatchQueryParam;
 import com.tzld.videoVector.model.vo.PageResult;
 import com.tzld.videoVector.model.po.pgVector.VideoArticleMatchResult;
 
+import java.util.List;
+
 /**
  * 视频→长文匹配结果查询服务
  */
@@ -16,4 +19,13 @@ public interface VideoArticleMatchService {
      * @return 分页结果(未传分页参数时总数字段即为全量记录数)
      */
     PageResult<VideoArticleMatchResult> queryMatchResult(VideoArticleMatchQueryParam param);
+
+    /**
+     * 按来源文章ID查询匹配的视频,按match_score倒序取topN。
+     * 自动取包含该sourceId的最大dt分区数据。
+     *
+     * @param param 查询参数(sourceId 必传,topN 可选,默认10)
+     * @return 匹配结果列表
+     */
+    List<VideoArticleMatchResult> queryBySourceId(VideoArticleMatchBySourceParam param);
 }

+ 23 - 0
core/src/main/java/com/tzld/videoVector/service/impl/VideoArticleMatchServiceImpl.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.tzld.videoVector.dao.mapper.pgVector.VideoArticleMatchResultMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.ext.VideoArticleMatchResultMapperExt;
+import com.tzld.videoVector.model.param.VideoArticleMatchBySourceParam;
 import com.tzld.videoVector.model.param.VideoArticleMatchQueryParam;
 import com.tzld.videoVector.model.po.pgVector.VideoArticleMatchResult;
 import com.tzld.videoVector.model.po.pgVector.VideoArticleMatchResultExample;
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -69,4 +71,25 @@ public class VideoArticleMatchServiceImpl implements VideoArticleMatchService {
             return PageResult.of(list, list.size(), 1, list.size());
         }
     }
+
+    @Override
+    public List<VideoArticleMatchResult> queryBySourceId(VideoArticleMatchBySourceParam param) {
+        // 找到包含该 sourceId 的最大 dt
+        String dt = videoArticleMatchResultMapperExt.selectMaxDtBySourceId(param.getAccount(), param.getSourceId());
+        if (!StringUtils.hasText(dt)) {
+            log.info("未找到 sourceId={} 的匹配记录,返回空结果", param.getSourceId());
+            return Collections.emptyList();
+        }
+        log.info("sourceId={} 最大 dt={}", param.getSourceId(), dt);
+
+        VideoArticleMatchResultExample example = new VideoArticleMatchResultExample();
+        VideoArticleMatchResultExample.Criteria criteria = example.createCriteria();
+        criteria.andDtEqualTo(dt).andChannelLevel3EqualTo(param.getAccount()).andMatchedArticleIdEqualTo(param.getSourceId());
+        example.setOrderByClause("match_score DESC");
+        PageHelper.startPage(1, param.getTopN());
+        List<VideoArticleMatchResult> list = videoArticleMatchResultMapper.selectByExample(example);
+
+        log.info("sourceId={} dt={} 返回 {} 条记录 (topN={})", param.getSourceId(), dt, list.size(), param.getTopN());
+        return list;
+    }
 }

+ 5 - 0
core/src/main/resources/mapper/pgVector/ext/VideoArticleMatchResultMapperExt.xml

@@ -28,4 +28,9 @@
     select max(dt) from video_article_match_result
   </select>
 
+  <select id="selectMaxDtBySourceId" resultType="java.lang.String">
+    select max(dt) from video_article_match_result
+    where channel_level3 = #{accountName,jdbcType=VARCHAR} and matched_article_id = #{sourceId,jdbcType=VARCHAR}
+  </select>
+
 </mapper>

+ 17 - 0
server/src/main/java/com/tzld/videoVector/controller/VideoArticleMatchController.java

@@ -1,6 +1,7 @@
 package com.tzld.videoVector.controller;
 
 import com.tzld.videoVector.common.base.CommonResponse;
+import com.tzld.videoVector.model.param.VideoArticleMatchBySourceParam;
 import com.tzld.videoVector.model.param.VideoArticleMatchQueryParam;
 import com.tzld.videoVector.model.po.pgVector.VideoArticleMatchResult;
 import com.tzld.videoVector.model.vo.PageResult;
@@ -11,6 +12,10 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
+
+import java.util.List;
+
 /**
  * 视频→长文匹配结果查询接口
  */
@@ -36,4 +41,16 @@ public class VideoArticleMatchController {
             @RequestBody VideoArticleMatchQueryParam param) {
         return CommonResponse.success(videoArticleMatchService.queryMatchResult(param));
     }
+
+    /**
+     * 按来源文章ID查询匹配的视频,按 match_score 倒序取 topN。
+     * <p>自动取包含该 sourceId 的最大 dt 分区数据。</p>
+     *
+     * @see <a href="docs/api/VideoArticleMatch-queryBySourceId.md">接口文档</a>
+     */
+    @PostMapping("/queryBySourceId")
+    public CommonResponse<List<VideoArticleMatchResult>> queryBySourceId(
+            @Valid @RequestBody VideoArticleMatchBySourceParam param) {
+        return CommonResponse.success(videoArticleMatchService.queryBySourceId(param));
+    }
 }