Просмотр полной версии : в бд много одинаковых новостей (dle)
здравствуйте . имеется сайт на дле где много одинаковых новостей. есть что нибудь что может решить эту проблему? заранее спасибо
Запрос внутри бд: DELETE FROM dle_news WHERE content LIKE %[Кусочек похожей новости]%
dle_news это имя таблицы
content - текст новости.
Запрос внутри бд: DELETE FROM dle_news WHERE content LIKE %[Кусочек похожей новости]% LIMIT 1
лучше так=)
Хм. Спасибо но немного не то. Там не дубликаты одной новости. Например-
Новость1 (и в бд еще допустим 5 таких новостей с таким же названием)
Новость2 (и в бд еще 5 таких новостей с таким же названием)
Нужно удалить дубликаты и чтоб осталась 1 оригинальная.
Новостей всего около 30 000. Вручную нереально перебирать
конечно я не имею понятия какая структура таблицы но все же. делать будем в 3 этапа=)
если заголовки статей хранаяться в отделном столбце то зб, тоесть структура такова:
id-label-text ну и еще дх полей...
вот если label это заголовок статьи, и они встречаються не уникальные то делаем так:
создаем 1 временную табличку, в 1 полем, назовем id, таблу назовем ids
копируем в нее ид уникальных статей
insert into ids (id)
SELECT DISTINCT
id
FROM
dle_news
GROUP BY label
а потом
delete from dle_news where id not in (select id from ids)
если не понятно стукни в аську объясню=)
вот хороший пост по теме
_http://www.mojbred.com/706.html
ап. проблема до сих пор не решена. еще раз повторюсь что я не знаю ид уник новостей. их очень много.
зы бд уже 60к новостей
и еще . например
-новость №1
-новость №1 2008
такие тоже желательно бы поудалять.
я в полном недоумении
думаю что только можно решить этот вопрос через поиск определенногопроцента совпадения в названиях.(Т.е. если в названии новости совпадают 3-4 слова и более, то добавит эти новости в список удаления, после чего я уже сам посмотрю, что в этом списке надо удалить,а что нет...)
но к сожалению данную идею реализовать не могу т.к не мой уровень(
заранее благодарен
limpompo
16.12.2008, 18:28
Ну создай скрипт который будет выводить дубликаты
select * from dle_post where title LIKE '%новость №1%'
далее выбираешь что удалить и удаляешь
DELETE FROM dle_post WHERE id = (id новости которую надо удалить)
мазахизм,но в дле есть функция замены быстрого текста во всей дле... найди где именно выполняеться код и вместо замены скажи что бы удалял все похожее....
мля..вы не понимаете
вот наглядный пример
_pswarez.net/index.php?newsid=54997 - новость Перевозчик 3 / Transporter 3 (2008)
смотрим поле Другие новости по теме:
посмотрите чем отличаются от этой
Перевозчик 3 Transporter 3 (2008) TS
Перевозчик 3 / Transporter 3 (2008) DVDRip+700Mb
Перевозчик 3 / Transporter 3 (2008) DVDRip
Перевозчик 3. Transporter 3 2008/TS
Перевозчик 3 / Transporter 3 (2008) DVDRip
и это только 5 первых похожих. думаю там их гораздо больше
и подобных новостей много. фильмы и софт.
и ПОЭТОМУ ИД уникальных новостей не знаю. прочитайте еще раз про идею процентного соотношения.
Можно написать хп.
Получится нечто вродь такого
delimiter ;;
CREATE PROCEDURE cl()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE s VARCHAR(100);
DECLARE cur CURSOR FOR SELECT DISTINCT SUBSTRING_INDEX(`title`,' ',2) FROM `table`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO s;
DELETE FROM `table` WHERE `id` IN (SELECT `t1`.`id` FROM (SELECT * FROM `table`) as `t1` WHERE `t1`.`title` LIKE CONCAT(s,'%') AND `id` <> (SELECT `t2`.`id` FROM (SELECT * FROM `table`) as `t2` WHERE `t2`.`title` LIKE CONCAT(s,'%') LIMIT 1));
UNTIL done END REPEAT;
END;;
Вызывается хп так:
call cl() где cl - эт имя нашей поцедуры.
Объясним некоторые специфические моменты:
SUBSTRING_INDEX(`title`,' ',2) - это по сути то, сколько ведущих слов нам брать. Слова разделяются пробелами. Например если этот код применить к строке "Перевозчик 3 Transporter 3 (2008) TS" получим "Перевозчик 3"
FROM (SELECT * FROM `table`) - такой финт ушами понадобился всвязи с некоторыми особенностями мускула
CONCAT(s,'%') - соответственно объединяем получанную нами из курсора строку со знаком % для составления шаблона.
Может код неоптимален и тд и тп - но он будет работать :) Если найдешь что оптимизировать - оптимизируй.
P.S. На достаточно большой базе при слабой машине - вполне можешь повесить субд. Или выполнение может занять продолжительное время.
ИМХО, легче набрать пяток модераторов, которые разберут эти авгиевы конюшни, а потом будут следить, чтобы не выкладывали по 10 раз одно и то же
Gifts автоматизция- великая вещь. Главное с умом подходить :)
Можно на стройке и кирпичи на 30-й этаж на горбу таскать - однако ж для чего то придумали подъемные краны, блоки и другие хитроумные приспособления =)
ну ну... однажды что-то не так пойдет, что то не так удалится из базы.. лучше пусть модеры ручками поработают.. тем более что не слишком сложная работа.
хотя не спорю что автоматизация - это хорошая вещь(=
ну ну... однажды что-то не так пойдет, что то не так удалится из базы..
А бэкапы на что?:) Легче восстановить новости за пол дня (а то и меньше - ночной бэкап + лог журналов), чем удалять 30к записей или больше вручную =)
А лучше при создании новости проверять есть ли похожие
А лучше при создании новости проверять есть ли похожие
естественно проверяется. если название точ в точь одинаковое то новость не добавится. постят боты =\
дык они в конце слеш допишут и все(((
естественно проверяется. если название точ в точь одинаковое то новость не добавится. постят боты =\
дык они в конце слеш допишут и все(((
Точно так же - проверяешь процент совпадения, или первые n слов.
Можно впринципе даж триггер на добавление в данную таблицу повесть - и в нем проверять.
Но что лучше конечн виднее тому, кто проектировал систему :)
естественно проверяется. если название точ в точь одинаковое то новость не добавится. постят боты =\
дык они в конце слеш допишут и все(((
%LIKE%
VDShark А что делать с разными версиями программы? Например PHP 5.2.6, PHP 5.2.8 Будут считаться одинаковыми, тоже самое с фильмами - Перевозчик ТС, Перевозчик DVDRip, Перевозчик HDRip Будут тоже беспощадно удаляться. Любое удаление без участия человека будет обречено удалить не то и не так.
Если же хочется как-то автоматизировать, то стоит присмотреться к ПХПшной функции нахождения расстояния левенштейна и к такой ее реализации:
function _levenshtein($str1, $str2) {
return 1-levenshtein($str1, $str2)/max(strlen($str1), strlen($str2));
}Где $str1 - название новой новости, а в $str2 подставлять все уже существующие названия. Если функция вернет величину больше 25, то отправлять на проверку модераторам. Функция правда тяжеловесная и обрабатывать данные будет долго.
Gifts, интересно...
А почему 25?
Isis 25% это уже достаточно похожие строки, хотя в общем-то число взял от балды, посмотрев что пример с названиями перевозчика похожи на 65%. Если убрать все числа и спец знаки из всех строк, то точность наверно увеличитя
Все это сугубо измышления, пока не тестил, завтра наверно попробую
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot