Хак Отключение поиска по полным новостям

Тема в разделе "DLE", создана пользователем lift, 7 окт 2012.

Информация :
Актуальная версия DataLife Engine 11.2
( Final Release v.11.2 | Скачать DataLife Engine | Скачать 11.2 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.1 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Модераторы: killoff
  1. lift

    lift Читатель

    Заблокирован
    Регистр.:
    1 июл 2007
    Сообщения:
    2.226
    Симпатии:
    1.378
    Возникла такая потребность. Чисто теоретически - отключить отправку запроса из поисковых форм и модулей + дропнуть индексы у поля полной новости, чтоб места не занимали столько.

    engine\ajax\search.php
    найти
    PHP:
    $db->query("SELECT id, short_story, title, date, alt_name, category FROM " PREFIX "_post WHERE " PREFIX "_post.approve=1".$this_date." AND (short_story LIKE '%{$query}%' OR full_story LIKE '%{$query}%' OR xfields LIKE '%{$query}%' OR title LIKE '%{$query}%') ORDER by date DESC LIMIT 5");
    заменить на
    PHP:
    $db->query("SELECT id, short_story, title, date, alt_name, category FROM " PREFIX "_post WHERE " PREFIX "_post.approve=1".$this_date." AND (short_story LIKE '%{$query}%' OR xfields LIKE '%{$query}%' OR title LIKE '%{$query}%') ORDER by date DESC LIMIT 5");

    engine\modules\search.php
    найти
    PHP:
    $titleonly_where = array ('0' => "MATCH(title,short_story,full_story,xfields) AGAINST ('{story}')",
    заменить на
    PHP:
    $titleonly_where = array ('0' => "MATCH(title,short_story,xfields) AGAINST ('{story}')",
    и

    найти
    PHP:
    $titleonly_where = array ('0' => "short_story LIKE '%{story}%' OR full_story LIKE '%{story}%' OR xfields LIKE '%{story}%' OR title LIKE '%{story}%'",
    заменить на
    PHP:
    $titleonly_where = array ('0' => "short_story LIKE '%{story}%' OR xfields LIKE '%{story}%' OR title LIKE '%{story}%'",
    С базой не смог придумать ничего умнее, чем дампануть ее и заменить
    Код:
    DROP TABLE IF EXISTS `dle_post`;
    CREATE TABLE `dle_post` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `autor` varchar(40) NOT NULL DEFAULT '',
      `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `short_story` text NOT NULL,
      `full_story` longtext NOT NULL,
      `xfields` text NOT NULL,
      `title` varchar(255) NOT NULL DEFAULT '',
      `descr` varchar(200) NOT NULL DEFAULT '',
      `keywords` text NOT NULL,
      `category` varchar(200) NOT NULL DEFAULT '0',
      `alt_name` varchar(200) NOT NULL DEFAULT '',
      `comm_num` mediumint(8) unsigned NOT NULL DEFAULT '0',
      `allow_comm` tinyint(1) NOT NULL DEFAULT '1',
      `allow_main` tinyint(1) unsigned NOT NULL DEFAULT '1',
      `approve` tinyint(1) NOT NULL DEFAULT '0',
      `fixed` tinyint(1) NOT NULL DEFAULT '0',
      `allow_br` tinyint(1) NOT NULL DEFAULT '1',
      `symbol` varchar(3) NOT NULL DEFAULT '',
      `tags` varchar(255) NOT NULL DEFAULT '',
      `metatitle` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `autor` (`autor`),
      KEY `alt_name` (`alt_name`),
      KEY `category` (`category`),
      KEY `approve` (`approve`),
      KEY `allow_main` (`allow_main`),
      KEY `date` (`date`),
      KEY `symbol` (`symbol`),
      KEY `comm_num` (`comm_num`),
      KEY `tags` (`tags`),
      KEY `fixed` (`fixed`),
      FULLTEXT KEY `short_story` (`short_story`,`full_story`,`xfields`,`title`)
    ) ENGINE=MyISAM AUTO_INCREMENT=15 /*!40101 DEFAULT CHARSET=utf8 */;
    на
    Код:
    DROP TABLE IF EXISTS `dle_post`;
    CREATE TABLE `dle_post` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `autor` varchar(40) NOT NULL DEFAULT '',
      `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `short_story` text NOT NULL,
      `full_story` longtext NOT NULL,
      `xfields` text NOT NULL,
      `title` varchar(255) NOT NULL DEFAULT '',
      `descr` varchar(200) NOT NULL DEFAULT '',
      `keywords` text NOT NULL,
      `category` varchar(200) NOT NULL DEFAULT '0',
      `alt_name` varchar(200) NOT NULL DEFAULT '',
      `comm_num` mediumint(8) unsigned NOT NULL DEFAULT '0',
      `allow_comm` tinyint(1) NOT NULL DEFAULT '1',
      `allow_main` tinyint(1) unsigned NOT NULL DEFAULT '1',
      `approve` tinyint(1) NOT NULL DEFAULT '0',
      `fixed` tinyint(1) NOT NULL DEFAULT '0',
      `allow_br` tinyint(1) NOT NULL DEFAULT '1',
      `symbol` varchar(3) NOT NULL DEFAULT '',
      `tags` varchar(255) NOT NULL DEFAULT '',
      `metatitle` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `autor` (`autor`),
      KEY `alt_name` (`alt_name`),
      KEY `category` (`category`),
      KEY `approve` (`approve`),
      KEY `allow_main` (`allow_main`),
      KEY `date` (`date`),
      KEY `symbol` (`symbol`),
      KEY `comm_num` (`comm_num`),
      KEY `tags` (`tags`),
      KEY `fixed` (`fixed`),
      FULLTEXT KEY `short_story` (`short_story`,`xfields`,`title`)
    ) ENGINE=MyISAM AUTO_INCREMENT=15 /*!40101 DEFAULT CHARSET=utf8 */;
    в дампе и залить обратно его.

    В принцепе работает всё. Т.к. мне ни похожих новостей не надо ни чего то в этом духе, то больше не пилил нигде, но думаю если индексы сносить, убирать поиск по полной новости надо отовсюду без исключения чтоб не получить в обратку всетаки выполнение скриптом поиска, но из за отсутствия индекса он начнет нагрузку давать значительно большую.

    Собственно пара вопросов:
    1) Больше не надо нигде ничего еще выпиливать?
    2) Кто накинет человеческий запрос SQL чтоб не через дамп убирать создание индекса? А то набить быстренько демо базу не проблема, но у меня тут лежит уже реально большая база рабочего сайта, с которой через правку дампа это делать сродни идиотизму будет.

    В идеале полная новость на сайте должна только для отображения юзеру выдергиваться и то, если ее нет в актуальном кеше движка. Тоесть хочется снизить нагрузку на БД максимально а поиск по полной новости - как раз и есть очень ненужная и замусоривающая выдачу функция.
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    Человеческий запрос SQL:
    Код:
    ALTER TABLE `dle_post`
    DROP INDEX `short_story` ,
    ADD FULLTEXT INDEX `short_story` (`short_story`, `xfields`, `title`) ;
    
    Для MyISAM таблица и индексы будут пересоздаваться - для очень больших баз это медленный процесс, наберитесь терпения... Но это явно быстрее чем дампы туда сюда гонять :)