|
|
@@ -5,19 +5,20 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
<id column="id" jdbcType="BIGINT" property="id" />
|
|
|
<result column="video_id" jdbcType="BIGINT" property="videoId" />
|
|
|
<result column="config_code" jdbcType="VARCHAR" property="configCode" />
|
|
|
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
|
|
|
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
|
|
|
+ <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
|
|
|
</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:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
<where>
|
|
|
<foreach collection="oredCriteria" item="criteria" separator="or">
|
|
|
@@ -51,7 +52,7 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
<where>
|
|
|
<foreach collection="example.oredCriteria" item="criteria" separator="or">
|
|
|
@@ -85,15 +86,15 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
- id, video_id, config_code, created_at, updated_at
|
|
|
+ id, video_id, config_code, created_at, updated_at, point_index
|
|
|
</sql>
|
|
|
<select id="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.VideoVectorExample" resultMap="BaseResultMap">
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
select
|
|
|
<if test="distinct">
|
|
|
@@ -112,7 +113,7 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
select
|
|
|
<include refid="Base_Column_List" />
|
|
|
@@ -123,7 +124,7 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
delete from video_vectors
|
|
|
where id = #{id,jdbcType=BIGINT}
|
|
|
@@ -132,7 +133,7 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
delete from video_vectors
|
|
|
<if test="_parameter != null">
|
|
|
@@ -143,18 +144,18 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
insert into video_vectors (video_id, config_code, created_at,
|
|
|
- updated_at)
|
|
|
+ updated_at, point_index)
|
|
|
values (#{videoId,jdbcType=BIGINT}, #{configCode,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP},
|
|
|
- #{updatedAt,jdbcType=TIMESTAMP})
|
|
|
+ #{updatedAt,jdbcType=TIMESTAMP}, #{pointIndex,jdbcType=INTEGER})
|
|
|
</insert>
|
|
|
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.VideoVector" useGeneratedKeys="true">
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
insert into video_vectors
|
|
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
|
|
@@ -170,6 +171,9 @@
|
|
|
<if test="updatedAt != null">
|
|
|
updated_at,
|
|
|
</if>
|
|
|
+ <if test="pointIndex != null">
|
|
|
+ point_index,
|
|
|
+ </if>
|
|
|
</trim>
|
|
|
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
|
|
<if test="videoId != null">
|
|
|
@@ -184,13 +188,16 @@
|
|
|
<if test="updatedAt != null">
|
|
|
#{updatedAt,jdbcType=TIMESTAMP},
|
|
|
</if>
|
|
|
+ <if test="pointIndex != null">
|
|
|
+ #{pointIndex,jdbcType=INTEGER},
|
|
|
+ </if>
|
|
|
</trim>
|
|
|
</insert>
|
|
|
<select id="countByExample" parameterType="com.tzld.videoVector.model.po.pgVector.VideoVectorExample" resultType="java.lang.Long">
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
select count(*) from video_vectors
|
|
|
<if test="_parameter != null">
|
|
|
@@ -201,7 +208,7 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
update video_vectors
|
|
|
<set>
|
|
|
@@ -220,6 +227,9 @@
|
|
|
<if test="record.updatedAt != null">
|
|
|
updated_at = #{record.updatedAt,jdbcType=TIMESTAMP},
|
|
|
</if>
|
|
|
+ <if test="record.pointIndex != null">
|
|
|
+ point_index = #{record.pointIndex,jdbcType=INTEGER},
|
|
|
+ </if>
|
|
|
</set>
|
|
|
<if test="_parameter != null">
|
|
|
<include refid="Update_By_Example_Where_Clause" />
|
|
|
@@ -229,14 +239,15 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
update video_vectors
|
|
|
set id = #{record.id,jdbcType=BIGINT},
|
|
|
video_id = #{record.videoId,jdbcType=BIGINT},
|
|
|
config_code = #{record.configCode,jdbcType=VARCHAR},
|
|
|
created_at = #{record.createdAt,jdbcType=TIMESTAMP},
|
|
|
- updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}
|
|
|
+ updated_at = #{record.updatedAt,jdbcType=TIMESTAMP},
|
|
|
+ point_index = #{record.pointIndex,jdbcType=INTEGER}
|
|
|
<if test="_parameter != null">
|
|
|
<include refid="Update_By_Example_Where_Clause" />
|
|
|
</if>
|
|
|
@@ -245,7 +256,7 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
update video_vectors
|
|
|
<set>
|
|
|
@@ -261,6 +272,9 @@
|
|
|
<if test="updatedAt != null">
|
|
|
updated_at = #{updatedAt,jdbcType=TIMESTAMP},
|
|
|
</if>
|
|
|
+ <if test="pointIndex != null">
|
|
|
+ point_index = #{pointIndex,jdbcType=INTEGER},
|
|
|
+ </if>
|
|
|
</set>
|
|
|
where id = #{id,jdbcType=BIGINT}
|
|
|
</update>
|
|
|
@@ -268,35 +282,36 @@
|
|
|
<!--
|
|
|
WARNING - @mbg.generated
|
|
|
This element is automatically generated by MyBatis Generator, do not modify.
|
|
|
- This element was generated on Wed Apr 29 15:13:43 CST 2026.
|
|
|
+ This element was generated on Wed Apr 29 19:29:43 CST 2026.
|
|
|
-->
|
|
|
update video_vectors
|
|
|
set video_id = #{videoId,jdbcType=BIGINT},
|
|
|
config_code = #{configCode,jdbcType=VARCHAR},
|
|
|
created_at = #{createdAt,jdbcType=TIMESTAMP},
|
|
|
- updated_at = #{updatedAt,jdbcType=TIMESTAMP}
|
|
|
+ updated_at = #{updatedAt,jdbcType=TIMESTAMP},
|
|
|
+ point_index = #{pointIndex,jdbcType=INTEGER}
|
|
|
where id = #{id,jdbcType=BIGINT}
|
|
|
</update>
|
|
|
|
|
|
<!-- ==================== 自定义向量操作 SQL ==================== -->
|
|
|
|
|
|
- <!-- Upsert: 插入或更新向量 -->
|
|
|
+ <!-- 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)
|
|
|
+ INSERT INTO video_vectors (video_id, config_code, point_index, embedding, created_at, updated_at)
|
|
|
+ VALUES (#{videoId}, #{configCode}, #{pointIndex}, #{embedding}::vector, NOW(), NOW())
|
|
|
+ ON CONFLICT (config_code, video_id, point_index)
|
|
|
DO UPDATE SET embedding = EXCLUDED.embedding, updated_at = NOW()
|
|
|
</insert>
|
|
|
|
|
|
- <!-- 判断是否存在 -->
|
|
|
+ <!-- 判断是否存在(任意 pointIndex) -->
|
|
|
<select id="existsByVideoIdAndConfigCode" resultType="int">
|
|
|
SELECT COUNT(1) FROM video_vectors
|
|
|
WHERE video_id = #{videoId} AND config_code = #{configCode}
|
|
|
</select>
|
|
|
|
|
|
- <!-- 批量查询已存在的 videoId -->
|
|
|
+ <!-- 批量查询已存在的 videoId(去重) -->
|
|
|
<select id="selectExistingVideoIds" resultType="java.lang.Long">
|
|
|
- SELECT video_id FROM video_vectors
|
|
|
+ SELECT DISTINCT video_id FROM video_vectors
|
|
|
WHERE config_code = #{configCode}
|
|
|
AND video_id IN
|
|
|
<foreach collection="videoIds" item="vid" open="(" separator="," close=")">
|
|
|
@@ -304,10 +319,10 @@
|
|
|
</foreach>
|
|
|
</select>
|
|
|
|
|
|
- <!-- 获取单个向量 -->
|
|
|
+ <!-- 获取单个向量(取 pointIndex=0) -->
|
|
|
<select id="selectEmbeddingByVideoIdAndConfigCode" resultType="java.lang.String">
|
|
|
SELECT embedding::text FROM video_vectors
|
|
|
- WHERE video_id = #{videoId} AND config_code = #{configCode}
|
|
|
+ WHERE video_id = #{videoId} AND config_code = #{configCode} AND point_index = 0
|
|
|
</select>
|
|
|
|
|
|
<!-- 批量获取向量 -->
|
|
|
@@ -315,13 +330,14 @@
|
|
|
<id column="id" jdbcType="BIGINT" property="id" />
|
|
|
<result column="video_id" jdbcType="BIGINT" property="videoId" />
|
|
|
<result column="config_code" jdbcType="VARCHAR" property="configCode" />
|
|
|
+ <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
|
|
|
<result column="embedding" jdbcType="VARCHAR" property="embedding" />
|
|
|
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
|
|
|
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
|
|
|
</resultMap>
|
|
|
|
|
|
<select id="selectVectorsByVideoIds" resultMap="VectorWithEmbeddingResultMap">
|
|
|
- SELECT id, video_id, config_code, embedding::text as embedding, created_at, updated_at
|
|
|
+ SELECT id, video_id, config_code, point_index, embedding::text as embedding, created_at, updated_at
|
|
|
FROM video_vectors
|
|
|
WHERE config_code = #{configCode}
|
|
|
AND video_id IN
|
|
|
@@ -330,13 +346,13 @@
|
|
|
</foreach>
|
|
|
</select>
|
|
|
|
|
|
- <!-- 获取指定 configCode 下所有 videoId -->
|
|
|
+ <!-- 获取指定 configCode 下所有 videoId(去重) -->
|
|
|
<select id="selectAllVideoIdsByConfigCode" resultType="java.lang.Long">
|
|
|
- SELECT video_id FROM video_vectors
|
|
|
+ SELECT DISTINCT video_id FROM video_vectors
|
|
|
WHERE config_code = #{configCode}
|
|
|
</select>
|
|
|
|
|
|
- <!-- 删除单个向量 -->
|
|
|
+ <!-- 删除单个视频的所有向量点 -->
|
|
|
<delete id="deleteByVideoIdAndConfigCode">
|
|
|
DELETE FROM video_vectors
|
|
|
WHERE video_id = #{videoId} AND config_code = #{configCode}
|
|
|
@@ -352,14 +368,15 @@
|
|
|
</foreach>
|
|
|
</delete>
|
|
|
|
|
|
- <!-- 余弦相似度搜索 Top-N -->
|
|
|
+ <!-- 余弦相似度搜索 Top-N(返回 videoId + pointIndex + score) -->
|
|
|
<resultMap id="SearchResultMap" type="com.tzld.videoVector.model.po.pgVector.VideoVector">
|
|
|
<result column="video_id" jdbcType="BIGINT" property="videoId" />
|
|
|
+ <result column="point_index" jdbcType="INTEGER" property="pointIndex" />
|
|
|
<result column="score" jdbcType="DOUBLE" property="score" />
|
|
|
</resultMap>
|
|
|
|
|
|
<select id="searchTopNByCosine" resultMap="SearchResultMap">
|
|
|
- SELECT video_id, 1 - (embedding <=> #{queryVector}::vector) AS score
|
|
|
+ SELECT video_id, point_index, 1 - (embedding <=> #{queryVector}::vector) AS score
|
|
|
FROM video_vectors
|
|
|
WHERE config_code = #{configCode}
|
|
|
ORDER BY embedding <=> #{queryVector}::vector
|