в бд много одинаковых новостей (dle)

Discussion in 'PHP' started by #Wolf#, 14 Sep 2008.

  1. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    здравствуйте . имеется сайт на дле где много одинаковых новостей. есть что нибудь что может решить эту проблему? заранее спасибо
     
  2. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    dle_news это имя таблицы
    content - текст новости.
     
    #2 Chaak, 14 Sep 2008
    Last edited: 14 Sep 2008
  3. NuR

    NuR Elder - Старейшина

    Joined:
    11 Dec 2005
    Messages:
    85
    Likes Received:
    58
    Reputations:
    -2
    лучше так=)
     
    1 person likes this.
  4. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    Хм. Спасибо но немного не то. Там не дубликаты одной новости. Например-
    Новость1 (и в бд еще допустим 5 таких новостей с таким же названием)
    Новость2 (и в бд еще 5 таких новостей с таким же названием)
    Нужно удалить дубликаты и чтоб осталась 1 оригинальная.
    Новостей всего около 30 000. Вручную нереально перебирать
     
  5. NuR

    NuR Elder - Старейшина

    Joined:
    11 Dec 2005
    Messages:
    85
    Likes Received:
    58
    Reputations:
    -2
    конечно я не имею понятия какая структура таблицы но все же. делать будем в 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)
    если не понятно стукни в аську объясню=)
     
  6. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    вот хороший пост по теме
    _http://www.mojbred.com/706.html
     
  7. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    ап. проблема до сих пор не решена. еще раз повторюсь что я не знаю ид уник новостей. их очень много.
    зы бд уже 60к новостей
    и еще . например
    -новость №1
    -новость №1 2008
    такие тоже желательно бы поудалять.
    я в полном недоумении
    думаю что только можно решить этот вопрос через поиск определенногопроцента совпадения в названиях.(Т.е. если в названии новости совпадают 3-4 слова и более, то добавит эти новости в список удаления, после чего я уже сам посмотрю, что в этом списке надо удалить,а что нет...)
    но к сожалению данную идею реализовать не могу т.к не мой уровень(
    заранее благодарен
     
  8. limpompo

    limpompo Новичок

    Joined:
    27 Aug 2005
    Messages:
    1,402
    Likes Received:
    308
    Reputations:
    453
    Ну создай скрипт который будет выводить дубликаты

    select * from dle_post where title LIKE '%новость №1%'

    далее выбираешь что удалить и удаляешь
    DELETE FROM dle_post WHERE id = (id новости которую надо удалить)
     
    2 people like this.
  9. nonamez

    nonamez Elder - Старейшина

    Joined:
    22 Jul 2007
    Messages:
    565
    Likes Received:
    265
    Reputations:
    17
    мазахизм,но в дле есть функция замены быстрого текста во всей дле... найди где именно выполняеться код и вместо замены скажи что бы удалял все похожее....
     
  10. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    мля..вы не понимаете
    вот наглядный пример
    _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 первых похожих. думаю там их гораздо больше
    и подобных новостей много. фильмы и софт.
    и ПОЭТОМУ ИД уникальных новостей не знаю. прочитайте еще раз про идею процентного соотношения.
     
  11. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Можно написать хп.
    Получится нечто вродь такого

    Code:
    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;;
    
    Вызывается хп так:
    Code:
    call cl()
    где cl - эт имя нашей поцедуры.

    Объясним некоторые специфические моменты:

    1. SUBSTRING_INDEX(`title`,' ',2) - это по сути то, сколько ведущих слов нам брать. Слова разделяются пробелами. Например если этот код применить к строке "Перевозчик 3 Transporter 3 (2008) TS" получим "Перевозчик 3"
    2. FROM (SELECT * FROM `table`) - такой финт ушами понадобился всвязи с некоторыми особенностями мускула
    3. CONCAT(s,'%') - соответственно объединяем получанную нами из курсора строку со знаком % для составления шаблона.

    Может код неоптимален и тд и тп - но он будет работать :) Если найдешь что оптимизировать - оптимизируй.

    P.S. На достаточно большой базе при слабой машине - вполне можешь повесить субд. Или выполнение может занять продолжительное время.
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    ИМХО, легче набрать пяток модераторов, которые разберут эти авгиевы конюшни, а потом будут следить, чтобы не выкладывали по 10 раз одно и то же
     
    _________________________
  13. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Gifts автоматизция- великая вещь. Главное с умом подходить :)

    Можно на стройке и кирпичи на 30-й этаж на горбу таскать - однако ж для чего то придумали подъемные краны, блоки и другие хитроумные приспособления =)
     
  14. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    ну ну... однажды что-то не так пойдет, что то не так удалится из базы.. лучше пусть модеры ручками поработают.. тем более что не слишком сложная работа.
    хотя не спорю что автоматизация - это хорошая вещь(=
     
  15. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    А бэкапы на что?:) Легче восстановить новости за пол дня (а то и меньше - ночной бэкап + лог журналов), чем удалять 30к записей или больше вручную =)
     
  16. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    А лучше при создании новости проверять есть ли похожие
     
  17. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    естественно проверяется. если название точ в точь одинаковое то новость не добавится. постят боты =\
    дык они в конце слеш допишут и все(((
     
  18. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Точно так же - проверяешь процент совпадения, или первые n слов.
    Можно впринципе даж триггер на добавление в данную таблицу повесть - и в нем проверять.
    Но что лучше конечн виднее тому, кто проектировал систему :)
     
  19. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    %LIKE%
     
  20. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    VDShark А что делать с разными версиями программы? Например PHP 5.2.6, PHP 5.2.8 Будут считаться одинаковыми, тоже самое с фильмами - Перевозчик ТС, Перевозчик DVDRip, Перевозчик HDRip Будут тоже беспощадно удаляться. Любое удаление без участия человека будет обречено удалить не то и не так.

    Если же хочется как-то автоматизировать, то стоит присмотреться к ПХПшной функции нахождения расстояния левенштейна и к такой ее реализации:
    PHP:
    function _levenshtein($str1$str2) {
        return 
    1-levenshtein($str1$str2)/max(strlen($str1), strlen($str2));
    }
    Где $str1 - название новой новости, а в $str2 подставлять все уже существующие названия. Если функция вернет величину больше 25, то отправлять на проверку модераторам. Функция правда тяжеловесная и обрабатывать данные будет долго.
     
    _________________________