海洋 CMS 采集重复数据如何自动过滤
海洋 CMS 采集重复数据最稳的过滤方式是"双保险":采集端把节点的重复数据处理设为"跳过重复",数据库端给影片主表 sea_data 的标题字段加唯一索引,再用一条 SQL 定时清理历史残留。只做前一步,靠程序字符串比对一定会漏;只做后一步,采集入库时可能整批报错。两步都做,重复数据基本归零。
海洋 CMS 采集重复数据是怎么产生的?
结论:重复的根源不是采集器不判断,而是它判断的字段是"标题字符串",字符串不一样就判不出重复。
同一部片子,A 站标题叫《庆余年 第二季》,B 站叫《庆余年第二季(2024) 全36集》,中间还夹着半角空格和全角括号,程序按原样比对,判为两条不同数据,于是两份都进了库。所以去重效果好不好,先看你的标题清洗做得干不干净,其次才看开关怎么设。
采集节点里怎么设置才能自动过滤?
结论:在采集节点的配置项里,把"重复数据处理"模式选成"跳过重复",而不是"覆盖"或"追加"。
海洋 CMS 的采集节点设置里通常有三种模式:
- 跳过重复:检测到已有数据就丢弃,保留老数据 —— 这是"自动过滤"要选的
- 覆盖重复:用新数据更新旧记录,适合追更
- 追加导入:完全不判断,直接插入,重复最多
不同版本菜单叫法略有差异,但逻辑一致。选完模式后,再进"过滤设置"把资源站标题里的通用后缀词填进过滤词表,比如「国语」「粤语」「HD」「高清」这类词统一清掉,再去比对,命中率会明显提高。如果你的版本支持按"标题+年份"组合判重,优先开这个组合,比只按标题准。
数据库加唯一索引,从根上堵死重复
结论:程序判断会漏,唯一索引不会漏,这是最后一道闸。
操作三步:
- 先备份,别跳过这一步:
- 清掉现存的重复记录(见下一节)
- 加唯一索引:
mysqldump -u root -p 数据库名 sea_data > sea_data_bak.sql
ALTER TABLE sea_data ADD UNIQUE KEY uk_vod_name (vod_name(191));
第三句里的 191 是 MySQL 在 utf8mb4 字符集下 InnoDB 索引的最长前缀长度,标题超过 191 个字符的部分不参与比对。注意:加完唯一索引后,如果采集时出现"Duplicate entry"并整批入库失败,说明采集端没做重复拦截,回到上一节把模式改对就行。索引和采集设置必须配套,缺一个都会出问题。
已经采进去的重复数据怎么批量删掉?
结论:一条自连接 SQL,保留每组里 vod_id 最小的那条,其余全删。
DELETE t1 FROM sea_data t1
INNER JOIN sea_data t2
ON t1.vod_name = t2.vod_name
AND t1.vod_id > t2.vod_id;
执行前先跑一遍 SELECT 版本数一下影响行数,心里有底再执行 DELETE。删完记得清理按 vod_id 关联的内容副表里的孤儿记录,否则后台详情页会出现空白。
想一劳永逸就挂个定时任务,crontab -e 里加一行每天凌晨 3 点执行:
0 3 * * * mysql -uroot -p密码 数据库名 -e "DELETE t1 FROM sea_data t1 INNER JOIN sea_data t2 ON t1.vod_name=t2.vod_name AND t1.vod_id>t2.vod_id;"
三个最容易踩的坑
第一,不做备份就加唯一索引,一旦表里有重复,ALTER 直接失败中止,白白折腾。第二,忽略空白字符,标题里一个半角空格就能让去重失效,可以先跑 UPDATE sea_data SET vod_name = REPLACE(vod_name,' ',''); 做一次统一清洗。第三,只开采集端开关就以为万事大吉,资源站改了标题格式之后,重复会重新堆积,数据库那道闸才是底线。
总结下来:采集节点设"跳过重复"负责日常拦截,标题过滤词负责提高命中率,sea_data 上的唯一索引负责兜底,定时 SQL 负责打扫历史。四件事按顺序做完,海洋 CMS 的重复数据问题基本就不用再管了。
原文链接:https://www.gj0.com/thread-518.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。